Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

06 | Python “黑箱”:输入与输出

Detecting file changes
Using a control file
Using with statement
Writing to a file
Reading from a file
print() function
input() function
Synchronization strategies
Designing server.py and client.py
Handling word count with large files
Reading and processing large files
Reading and writing JSON to files
json.loads()
json.dumps()
File Input and Output
Basic Input and Output
File Transfer Example
NLP Example
JSON Serialization
Python I/O
Python I/O and JSON Serialization

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
世纪之交的论坛上曾有一句流行语:在互联网上,没人知道你是一条狗。互联网刚刚兴起时,一根网线链接到你家,信息通过这条高速线缆直达你的屏幕,你通过键盘飞速回应朋友的消息,信息再次通过网线飞入错综复杂的虚拟世界,再进入朋友家。抽象来看,一台台的电脑就是一个个黑箱,黑箱有了输入和输出,就拥有了图灵机运作的必要条件。
Python 程序也是一个黑箱:通过输入流将数据送达,通过输出流将处理后的数据送出,可能 Python 解释器后面藏了一个人,还是一个史莱哲林?No one cares。
好了废话不多说,今天我们就由浅及深讲讲 Python 的输入和输出。

输入输出基础

最简单直接的输入来自键盘操作,比如下面这个例子。
name = input('your name:')
gender = input('you are a boy?(y/n)')
###### 输入 ######
your name:Jack
you are a boy?
welcome_str = 'Welcome to the matrix {prefix} {name}.'
welcome_dic = {
'prefix': 'Mr.' if gender == 'y' else 'Mrs',
'name': name
}
print('authorizing...')
print(welcome_str.format(**welcome_dic))
########## 输出 ##########
authorizing...
Welcome to the matrix Mr. Jack.
input() 函数暂停程序运行,同时等待键盘输入;直到回车被按下,函数的参数即为提示语,输入的类型永远是字符串型(str)。注意,初学者在这里很容易犯错,下面的例子我会讲到。print() 函数则接受字符串、数字、字典、列表甚至一些自定义类的输出。
我们再来看下面这个例子。
a = input()
1
b = input()
2
print('a + b = {}'.format(a + b))
########## 输出 ##############
a + b = 12
print('type of a is {}, type of b is {}'.format(type(a), type(b)))
########## 输出 ##############
type of a is <class 'str'>, type of b is <class 'str'>
print('a + b = {}'.format(int(a) + int(b)))
########## 输出 ##############
a + b = 3
这里注意,把 str 强制转换为 int 请用 int(),转为浮点数请用 float()。而在生产环境中使用强制转换时,请记得加上 try except(即错误和异常处理,专栏后面文章会讲到)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
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-26
    7
    60
  • 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-26
    20
    52
  • 小云同学
    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-22
    15
    63
  • 逆光飞翔
    老师,为什么filter(none,list)可以过滤空值,不是保留空值嘛

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

    2019-05-22
    3
    31
  • 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-22
    2
    12
  • 許敲敲
    这门课太值了 哈哈哈 我以前学到的真的toy python

    作者回复: 谢谢,加油!

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

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

    2019-05-22
    9
  • 人间乐园
    第一道,for.line in fin读取单行,使用result = yied line进行双向传递,直接把line给计数器,先判断line结尾处,如果是单词或者半个单词,则返回result给生成器,拼接到下一个line前,如果是None则不拼接,继续生成这个line。

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

    2019-05-22
    4
  • IT蜗壳-Tango
    第七天打卡。

    作者回复: 👍

    2019-05-22
    4
  • mykgzy
    看着有点费力,但感觉超值,看到了好多python 书都没提到的生产网中涉及的知识。

    作者回复: 这也是这门课的核心价值之一,愿能有所收获

    2019-05-22
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部