https://github.com/wilsonyin123/geekbangpython/tree/master/txt
作者回复: 操作的单位都是字节。 另 ASCII码中,一个英文字母占一个字节,中文汉字占两个字节;UTF-8编码中,一个英文字母占一个字节,中文占三个字节;Unicode编码应为和中文都是两个字节。
作者回复: 有道理,改变文件内容或者多移动几个位置会让大家更好理解,谢谢你的反馈,后面注意提升演示代码友好度。
作者回复: seek()操作非常简单,这里主要希望大家了解文件指针这个概念,因此我没有太详细讲解每个参数。一般我们对文本经常用到的就只有移动到开头和移动到结尾操作。如果需要使用第二个参数,需要在打开文件的时候使用b参数,我想你遇到的问题应该是open(‘文件名’,‘r’) 只使用了r参数。这个是Python的规定了。 常用操作如下: # 移动到文件开头,重新读取文件 f = open(‘b.txt’,’rb’) # b.txt 内容 f.read() # b’hello python1\nhello python2\n' f.seek(0) # 移动到文件的开头 f.seek(0,0) # 移动到文件的开头 # 移动到文件结尾,以便追加新的信息 f.seek(0,2) # 28 # 注意这两种操作无需open()函数的第二个参数使用’b’参数,但是当你使用seek()函数第二个参数为1、2时,第一个参数如果是非0 就要增加’b’参数,否则会报错了。 #取得倒数第三个字符 f.seek(-3,2) # 25 f.read(1) # b’n’ # 取得第7个字符 f.seek(0) # 0 f.seek(6,0) # 6 f.read(1) # b’p’ # 另一种方法 f.seek(4,0) # 4 f.seek(2,1) # 2 f.read(1) # b’p’ 了解了什么情况能够使用seek()第二个参数之后再来说一下中文的问题。因为中文涉及到两种常见编码: utf-8和gb2312,由于你使用的是mac系统,默认在文本文件写入一个汉字,就会占用三个位置。 例如:“你好” 使用 open(‘filename’,’rb’)方式打开就是 b'\xe4\xbd\xa0\xe5\xa5\xbd’ 这样的内容,那么要注意操作汉字必须要保证是三个位置一起操作,才是操作一个汉字。而如果open()函数不带b参数,seek()函数依然只能使用移动到开头和结尾,没有看到你的具体错误信息,但我猜想这可能就是你的报错原因了,比如使用seek读取第二个汉字 f = open('b.txt','rb') # '你好,python\n极客时间\n' f.read() # b’\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython\n\xe6\x9e\x81\xe5\xae\xa2\xe6\x97\xb6\xe9\x97\xb4\n' f.seek(1,0) # 1 f.seek(2,1) # 3 f.read(3).decode('utf-8') # ‘好’
作者回复: 在pycharm使用ctrl+/ 可以把选中的行注释掉,再次输入可以取消注释
作者回复: 学习编程是一条不断上升的曲线,爬过波峰会看到更美的风景,加油哦!
作者回复: 在windows下,打开文件默认使用的是和系统相同的字符编码即gbk,但是文件为utf-8编码,为open增加 enconding=utf-8 属性就可以解决了
作者回复: 他们统称为内置函数库,在官方文档https://docs.python.org/zh-cn/3.7/library/index.html https://docs.python.org/zh-cn/3.7/library/functions.html 标准库这个位置可以找到
作者回复: 您好,UnicodeDecodeError: 'gbk' 是表示文件为gbk编码,可以使用open('name.txt',encoding='gbk')方式读取, 另外要注意由于seek()是按照字节操作的,如果文件里面有汉字要注意两个字节一个汉字。
作者回复: 要保证读写编码一致才会不出现乱码,例如windows是gb2312,linux是utf8,python要根据需要调整写入和读取的编码,保证读写的参数 文件的编码 操作系统的编码一致才会不出现乱码
作者回复: 你好,和字符集以及文本里的内容都有关系,这里的read()单位是字,比如一个字母占用1个字符,一个汉字占用2个字符,而read()读取一个字,它的位置自然会向后移动2个字符, 所以结果为tell() --- 输出3 。