• Jingxiao 置顶
    2019-05-26
    思考题第二题:(省略了一些异常处理,后面会讲到)
    server.py
    # 我们假设 server 电脑上的所有的文件都在 BASR_DIR 中,为了简化不考虑文件夹结构,网盘的路径在 NET_DIR

    import os
    from shutil import copyfile
    import time

    BASE_DIR = 'server/'
    NET_DIR = 'net/'

    def main():
        filenames = os.listdir(BASE_DIR)
        for i, filename in enumerate(filenames):
            print('copying {} into net drive... {}/{}'.format(filename, i + 1, len(filenames)))
            copyfile(BASE_DIR + filename, NET_DIR + filename)
            print('copied {} into net drive, waiting client complete... {}/{}'.format(filename, i + 1, len(filenames)))

            while os.path.exists(NET_DIR + filename):
                time.sleep(3)

        print('transferred {} into client. {}/{}'.format(filename, i + 1, len(filenames)))

    if __name__ == "__main__":
        main()

    ++++++++++++++++++++++
    client.py
    # 我们假设 client 电脑上要输出的文件夹在 BASR_DIR ,网盘的路径在 NET_DIR

    import os
    from shutil import copyfile
    import time

    BASE_DIR = 'client/'
    NET_DIR = 'net/'

    def main():
        while True:
            filenames = os.listdir(NET_DIR)
            for filename in filenames:
                print('downloading {} into local disk...'.format(filename))
                copyfile(NET_DIR + filename, BASE_DIR + filename)
                os.remove(NET_DIR + filename) # 我们需要删除这个文件,网盘会提我们同步这个操作,从而 server 知晓已完成
                print('downloaded {} into local disk.'.format(filename))
            time.sleep(3)

    if __name__ == "__main__":
        main()
    展开
     3
     30
  • Jingxiao 置顶
    2019-05-26
    思考题第一题:

    import re

    CHUNK_SIZE = 100 # 这个数表示一次最多读取的字符长度

    # 这个函数每次会接收上一次得到的 last_word,然后和这次的 text 合并起来处理。
    # 合并后判断最后一个词有没有可能连续,并分离出来,然后返回。
    # 这里的代码没有 if 语句,但是仍然是正确的,可以想一想为什么。
    def parse_to_word_list(text, last_word, word_list):
        text = re.sub(r'[^\w ]', ' ', last_word + text)
        text = text.lower()
        cur_word_list = text.split(' ')
        cur_word_list, last_word = cur_word_list[:-1], cur_word_list[-1]
        word_list += filter(None, cur_word_list)
        return last_word

    def solve():
        with open('in.txt', 'r') as fin:
            word_list, last_word = [], ''
            while True:
                text = fin.read(CHUNK_SIZE)
                if not text:
                    break # 读取完毕,中断循环
                last_word = parse_to_word_list(text, last_word, word_list)

            word_cnt = {}
            for word in word_list:
                if word not in word_cnt:
                    word_cnt[word] = 0
                word_cnt[word] += 1

            sorted_word_cnt = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)
            return sorted_word_cnt

    print(solve())
    展开
     9
     27
  • 不瘦到140不改名
    2019-05-22
    from collections import defaultdict
    import re

    f = open("ini.txt", mode="r", encoding="utf-8")
    d = defaultdict(int)

    for line in f:
        for word in filter(lambda x: x, re.split(r"\s", line)):
            d[word] += 1


    print(d)
    展开

    作者回复: 👍

     5
     31
  • 逆光飞翔
    2019-05-22
    老师,为什么filter(none,list)可以过滤空值,不是保留空值嘛

    作者回复: filter(None, Iterable) 是一种容易出错的用法,这里不止过滤空字符串,还能过滤 0,None,空列表等值。这里的 None,严格意义上等于 lambda x: x, 是一个 callable。

     2
     17
  • Geek_59f23e
    2019-05-22
    第一题:
    1、使用defaultdict初始化计数器更方便更快,不用再多做一步in判断,parse函数只需返回filter对象。

    2、读取大文件时使用for循环遍历迭代器,不占用内存空间,生成一行处理一行,就此例来说每一行行尾都是\n没有跨行单词,故此方法不用考虑边界问题,因文件中有多行\n,读取时做一步判断跳过避免再调用parse函数。

    word_cnt = defaultdict(lambda: 0)

    with open('in_big.txt', 'r') as fin:
        for line in fin:
            if line != '\n':
                for word in parse(line):
                    word_cnt[word] += 1

    第二题:
    说说思路,具体应该需要搭建web实现吧。

    1、server设置上传目录存放20个5G文件,开启while True进程检测网盘有无数据,数据为空时POST目录中5G文件,上传完毕后本地删除或者将其移出上传目录,直到上传目录为空时结束程序。

    2、client开启while True进程检测网盘有无数据,数据不为空时GET下载5G文件,下载完成后DELETE请求删除网盘数据。
    展开
    
     8
  • lmingzhi
    2019-05-22
    # 第一题, 修改parse函数,使其可以更新word_cnt
    import re
    def parse(text, word_cnt):
        # 转为小写
        text = text.lower()
        # 生成所有单词的列表
        word_list = re.findall(r'\w+', text)
        # 更新单词和词频的字典
        for word in word_list:
            word_cnt[word] = word_cnt.get(word,0) + 1
        return word_cnt

    # 初始化字典
    word_cnt = dict()
    with open('in.txt', 'r') as fin:
        for text in fin.readlines():
            word_cnt = parse(text, word_cnt)
            print(len(word_cnt))

    # 按照词频排序
    sorted_word_cnt = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)

    # 导出
    with open('out.txt', 'w') as fout:
        for word, freq in word_and_freq:
            fout.write('{} {}\n'.format(word, freq))
    展开

    作者回复: 👍

    
     7
  • Python高效编程
    2019-05-22
    第一问:
    with open("in.txt", "rt") as f:
        for line in f:
            Counter.update(line)

    作者回复: 想到 Counter 很棒,但是这样注意这样不行哦,Counter 初始化输入 str 会把 str 视作一个容器,最后 Counter 里存的全是单个字符和它的次数,而不是单词。

    
     5
  • 許敲敲
    2019-05-22
    这门课太值了 哈哈哈 我以前学到的真的toy python

    作者回复: 谢谢,加油!

    
     4
  • code2
    2019-05-23
    看到一片短文,摘录如下:
    数据科学家是“比软件工程师更擅长统计学,比统计学家更擅长软件工程的人”。许多数据科学家都具有统计学背景,但是在软件工程方面的经验甚少。我是一名资深数据科学家,在Stackoverflow的python编程方面排名前1%,并与许多(初级)数据科学家共事。以下是我经常看到的10大常见错误,本文将为你相关解决方案:

    删去前九个只余一个:

    使用jupyter notebook

    展开
    
     3
  • ........
    2019-05-23
    from collections import defaultdict
    import re

    d = defaultdict(int)

    with open('in.txt', 'r') as fin:
        text = fin.readline()
        while text:
            text = re.sub(r'[^\w ]', '', text)
            text = text.lower()
            word_list = text.split(' ')
        
            word_list = filter(None, word_list)
            for word in word_list:
                d[word] += 1
            text = fin.readline()
        
        # 按照词频排序
        sorted_word_cnt = sorted(d.items(), key=lambda kv: kv[1], reverse=True)
        



    展开
    
     3
  • 宝仔
    2019-05-23
    word_cnt = dict()!老师你之前不是说过:word_cnt = {}这样初始化字典不是效率更高吗?为什么你代码里用了函数初始化字典
    
     3
  • Lone
    2019-05-22
    第一题打卡
    import re

    def parse(text, word_cnt):
        text = text.lower()
        # print("--------------------{}".format(text))
        word_list = re.findall(r"\w+", text)
        # print(word_list)
        for word in word_list:
            word_cnt[word] = word_cnt.get(word, 0) + 1

        return word_cnt

    word_cnt = dict()

    # 读取文件
    with open("./in.txt", "r") as fin:
        for line in fin:
            word_cnt = parse(line, word_cnt)

    # print(word_cnt)

    word_and_freq = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)

    # print(word_and_freq)
    with open("./out.txt", "w") as fout:
        for word, freq in word_and_freq:
            fout.write("{} {}\n".format(word, freq))
    展开
    
     3
  • 人间乐园
    2019-05-22
    第一道,for.line in fin读取单行,使用result = yied line进行双向传递,直接把line给计数器,先判断line结尾处,如果是单词或者半个单词,则返回result给生成器,拼接到下一个line前,如果是None则不拼接,继续生成这个line。

    作者回复: 很棒的思路,但是注意如果原始文件只有一行呢?你想说的是读取一定长度的字符串吧

    
     3
  • Tango
    2019-05-22
    第七天打卡。

    作者回复: 👍

    
     3
  • 王豪
    2019-07-23
    老师,这样统计词频效率应该会高一些吧
    word_cnt={}
    for word in word_list:
        word_cnt[word] = word_cnt.get(word, 0) + 1
    
     2
  • 种种
    2019-06-28
    不管最后一个单词断不断都可以放到下次一起,总不会错。整个单词,放到下次没毛病,中断的单词放到下次,理应如此。
    
     2
  • -Deeplikesea-
    2019-06-17
    老师,我还没有看到github的代码呢?想学习一下您怎么写的。
    
     2
  • zxq
    2019-05-22
    老师,想请问一下python关于线程管理机制,举个例子来说:我有两个程序read.py和write.py,一个是负责读取info.txt内容,而另一个是将数据写入这个txt。由于我不知道两个python程序会不会同时被调用,假设调用write.py写入数据时,尚未释放txt的端口,这时候read.py被调用来读取数据,这时候就有冲突了。python如何处理这样的机制呢?如何优化这两个py文件,可不可以通过调用端口占用状态来解决呢?
     1
     2
  • vivien_zh
    2019-05-22
    努力跟上老师的进度。

    作者回复: 多实践,多编码,多思考,一定没问题的

    
     2
  • 孙有能希
    2019-09-02
    re.sub(r'[^\w ]', ' ', text) 是怎么替换掉标点符号和换行的?查了半天也没理解。
     3
     1
我们在线,来聊聊吧