作者回复: 操作的单位都是字节。
另 ASCII码中,一个英文字母占一个字节,中文汉字占两个字节;UTF-8编码中,一个英文字母占一个字节,中文占三个字节;Unicode编码应为和中文都是两个字节。
作者回复: 有道理,改变文件内容或者多移动几个位置会让大家更好理解,谢谢你的反馈,后面注意提升演示代码友好度。
作者回复: 在pycharm使用ctrl+/ 可以把选中的行注释掉,再次输入可以取消注释
作者回复: 学习编程是一条不断上升的曲线,爬过波峰会看到更美的风景,加油哦!
作者回复: 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') # ‘好’
作者回复: 您好,UnicodeDecodeError: 'gbk' 是表示文件为gbk编码,可以使用open('name.txt',encoding='gbk')方式读取, 另外要注意由于seek()是按照字节操作的,如果文件里面有汉字要注意两个字节一个汉字。
作者回复: 要保证读写编码一致才会不出现乱码,例如windows是gb2312,linux是utf8,python要根据需要调整写入和读取的编码,保证读写的参数 文件的编码 操作系统的编码一致才会不出现乱码
作者回复: 搜索需要引入re模块,一般使用re.findall( )可以进行查找,我提供一下官方文档,后面视频在标准库部分会有介绍。https://docs.python.org/zh-cn/3.6/library/re.html
作者回复: 您好, 作业里面我使用了 with 这个 上下文管理器打开文件, as 后面跟的是文件描述符, 意思是打开文件成功之后,后续对文件操作可以使用此文件描述符即可,在课程后面有关于with 的讲解。
作者回复: 偏移量和文件内容以及字符编码是有关的,比如我的第一个是字母,偏移就是1;如果是gb2312字符集,第一个是汉字,偏移量就是2,utf8字符集就是3
作者回复: file.write('hello') 是把内容写入到文件,得到的是写入字符的数量,这里如果打印返回值,应该为5。
注意: 官方文档中描述write( )无返回值,所以不应该有print 输出
作者回复: 试试 seek(-3,2)
作者回复: 在python3中,没有使用b模式选项打开的文件,只允许从文件头开始计算位置,从文件尾计算时就会引发异常
需要使用 file6 = open('name.txt','rb')
作者回复: 您好, 在第一句 print('当前读取到了一个字符,字符的内容是 s%' % file6.read(1)) 就产生了报错,
可以根据错误提示的 File "/Users/paulakisscat/PycharmProjects/file_op.py", line 25 定位到哪个文件的第几行产生的错误,而ValueError: incomplete format 是类型错误,字符串替换应该是%s,而不是s%
作者回复: 文本不是gbk编码,假设文本时utf-8 编码,在open()的时候增加encoding=utf-8 参数来解决
作者回复: 我使用gbk编码重现了你的结果,把你的问题再简单化就是:英文字母占1字节,gbk编码汉字占2字节,utf-8编码汉字占三字节,按照官方文档写法read(3)应该读取三个字节,应该是“a诸”,而不是“a诸葛”
官方文档描述如下:
“read(size=-1)
Read up to size bytes from the object and return them”
文档链接 https://docs.python.org/zh-cn/3.6/library/io.html
产生这样结果的原因在open( )函数,如果open( )函数的参数带“b” 则read会按照字节读取,如果不带就会按照字符读取,即:utf-8汉字会读取一个完整汉字(一个字符,三个字节),gb2312也会读取一个完整汉字(一个字符,两个字节)
作者回复: 把当前文件名暂存成变量,从原始文件读取到下一个文件名之后可以做对比
作者回复: 首先,你的新文件名来源于文本内容本身,就需要一个暂存的空间--变量。如果存储多个,还是顺序的要考虑使用一个顺序的数据结构,列表是一个很好的选择。最后文本处理一定是按顺序读取的,而你的需求应该是逐行读取,那要考虑在每行读入进来之后,判断这行作为文件名还是文件内容对待,如果文件名要做创建文件处理,如果内容,要做添加到文件中处理。希望能帮到你