06 | Python “黑箱”:输入与输出
该思维导图由 AI 生成,仅供参考
输入输出基础
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Python程序中的输入输出基础知识以及文件输入输出相关内容。通过简单的代码示例,读者可以了解Python中的输入输出基本操作,包括使用input()函数接受键盘输入和print()函数输出结果。此外,文章还介绍了文件访问的基础知识,包括open()函数的使用、read()和write()函数的作用,以及with语句的应用。特别强调了对所有I/O操作进行错误处理的重要性。 另外,文章还介绍了JSON(JavaScript Object Notation)的序列化与实战应用。通过具体的例子,读者可以了解如何使用json.dumps()和json.loads()函数进行Python数据类型和字符串之间的转换,以及如何将JSON字符串读取/输出到文件中。 最后,文章提出了两道思考题,分别涉及NLP例子中的word count实现和家里数据传输到公司的需求。这些思考题可以帮助读者巩固所学知识,并引发进一步的思考和学习。 总的来说,本文通过实际代码示例和详细解释,帮助读者了解了Python程序中输入输出的基本操作,以及文件输入输出的相关知识,为读者提供了实用的技术指导和注意事项。同时,通过JSON序列化的实战应用和思考题的提出,激发了读者的学习兴趣和思考能力。
《Python 核心技术与实战》,新⼈⾸单¥59
全部留言(135)
- 最新
- 精选
- Jingxiao置顶思考题第二题:(省略了一些异常处理,后面会讲到) 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()2019-05-26760
- Jingxiao置顶思考题第一题: 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())2019-05-262052
- 小云同学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)
作者回复: 👍
2019-05-221563 - 逆光飞翔老师,为什么filter(none,list)可以过滤空值,不是保留空值嘛
作者回复: filter(None, Iterable) 是一种容易出错的用法,这里不止过滤空字符串,还能过滤 0,None,空列表等值。这里的 None,严格意义上等于 lambda x: x, 是一个 callable。
2019-05-22331 - lmingzhi# 第一题, 修改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))
作者回复: 👍
2019-05-22212 - 許敲敲这门课太值了 哈哈哈 我以前学到的真的toy python
作者回复: 谢谢,加油!
2019-05-2211 - Python高效编程第一问: with open("in.txt", "rt") as f: for line in f: Counter.update(line)
作者回复: 想到 Counter 很棒,但是这样注意这样不行哦,Counter 初始化输入 str 会把 str 视作一个容器,最后 Counter 里存的全是单个字符和它的次数,而不是单词。
2019-05-229 - 人间乐园第一道,for.line in fin读取单行,使用result = yied line进行双向传递,直接把line给计数器,先判断line结尾处,如果是单词或者半个单词,则返回result给生成器,拼接到下一个line前,如果是None则不拼接,继续生成这个line。
作者回复: 很棒的思路,但是注意如果原始文件只有一行呢?你想说的是读取一定长度的字符串吧
2019-05-224 - IT蜗壳-Tango第七天打卡。
作者回复: 👍
2019-05-224 - mykgzy看着有点费力,但感觉超值,看到了好多python 书都没提到的生产网中涉及的知识。
作者回复: 这也是这门课的核心价值之一,愿能有所收获
2019-05-223