r
以只读⽅式打开⽂件rb
以⼆进制只读⽅式打开⼀个⽂件r+
以读写⽅式打开⼀个⽂件rb+以⼆进制读写⽅式打开⼀个⽂件w 以写⼊⽅式打开⽂件wb 以⼆进制写⼊⽅式打开⼀个⽂件w+以读写⽅式打开⼀个⽂件
wb+以⼆进制读写⽅式打开⼀个⽂件a
以追加⽅式打开⼀个⽂件ab 以⼆进制追加⽅式打开⼀个⽂件a+以读写⽅式打开⼀个⽂件ab+以⼆进制追加⽅式打开⼀个⽂件Python 之⽂件的读取、创建、追加、删除、清空、替换前⾔
python怎么读文件夹下的文件夹
打开⽂件的⽅式:
上⾯的b 表⽰⼆进制,+表⽰以读写⽅式,r 表⽰读,w 表⽰写。 正⽂
⼀、⽤Python 创建⼀个新⽂件,内容是从0到9的整数, 每个数字占⼀⾏:
f=open('f.txt','w')    # r 只读,w 可写,a 追加
for  i in  range(0,10):    f.write(str(i)+'\n')f.close()⼆、⽂件内容追加,从0到9的10个随机整数:
import  random
f = open('f.txt', 'a')
for  i in  range(0, 10):
f.write(str(random.randint(0, 9)))
f.write('\n')
f.close()
三、⽂件内容追加,从0到9的随机整数, 10个数字⼀⾏,共10⾏:
import  random
f = open('f.txt', 'a')
for  i in  range(0, 10):
for  j in  range(0, 10):
f.write(str(random.randint(0, 9)))
f.write('\n')
f.close()
四、把标准输出定向到⽂件:
import  sys
sys.stdout = open("", "w", encoding='utf-8')
print ('将原本输出⾄控制台的内容定向输出⾄⽂件中')
五、⽂件的读写:
1、⽂件打开:
f = file(name[, mode[, buffering]])
⼊参:          name ⽂件名
mode  选项,字符串
buffering  是否缓冲 (0=不缓冲,1=缓冲, >1的int 数=缓冲区⼤⼩)
返回值 : ⽂件对象
mode 选项:
"r"  以读⽅式打开,只能读⽂件;如果⽂件不存在,会发⽣异常
"w"  以写⽅式打开,只能写⽂件;如果⽂件不存在,创建该⽂件;如果⽂件已存在,先清空,再打开⽂件
"rb"  以⼆进制读⽅式打开,只能读⽂件;如果⽂件不存在,会发⽣异常
"wb"  以⼆进制写⽅式打开,只能写⽂件;如果⽂件不存在,创建该⽂件;如果⽂件已存在,先清空,再打开⽂件
"rt"  以⽂本读⽅式打开,只能读⽂件;如果⽂件不存在,会发⽣异常
"wt"  以⽂本写⽅式打开,只能写⽂件;如果⽂件不存在,创建该⽂件;如果⽂件已存在,先清空,再打开⽂件
"rb+" 以⼆进制读⽅式打开,可以读、写⽂件;如果⽂件不存在,会发⽣异常
"wb+"以⼆进制写⽅式打开,可以读、写⽂件;如果⽂件不存在,创建该⽂件;如果⽂件已存在,先清空,再打开⽂件
2、关闭⽂件:
f.close()
当⽂件读写完毕后,应关闭⽂件。
3、清空⽂件内容:
注意:仅当以 "r+"  "rb+"    "w"  "wb" "wb+"等以可写模式打开的⽂件才可以执⾏该功能。
4、⽂件的指针定位与查询
(1)⽂件指针:
⽂件被打开后,其对象保存在变量f中,它会记住⽂件的当前位置,以便于执⾏读、写操作,这个位置称为⽂件的指针( ⼀个从⽂件头部开始计算的字节数 long 类型 )。
(2)⽂件打开时的位置:
以"r"  "r+"  "rb+" 读⽅式,"w"  "w+"  "wb+"写⽅式打开的⽂件,⼀开始,⽂件指针均指向⽂件的头部。
(3) 获取⽂件指针的值:
L = f.tell()
(4) 移动⽂件的指针:
f.seek(偏移量, 选项 )
选项 =0 时,表⽰将⽂件指针指向从⽂件头部到 "偏移量"字节处。
选项 =1 时,表⽰将⽂件指针指向从⽂件的当前位置,向后移动 "偏移量"字节。
选项 =2 时,表⽰将⽂件指针指向从⽂件的尾部,,向前移动 "偏移量"字节。
5、从⽂件读取指内容:
(1)⽂本⽂件(以"rt"⽅式打开的⽂件)的读取:
s = f.readline()
返回值: s 是字符串,从⽂件中读取的⼀⾏,含⾏结束符。
说明: (1)  如果 len(s) =0 表⽰已到⽂件尾
(2)  如果是⽂件的最后⼀⾏,有可能没有⾏结束符
(2)⼆进制⽂件(以"rb"、"rb+"、"wb+" ⽅式打开的⽂件)的读取:
s = f.read(n)
说明: (1)  如果 len( s ) =0 表⽰已到⽂件尾
(2)  ⽂件读取后,⽂件的指针向后移动 len(s) 字节。
(3)如果磁道已坏,会发⽣异常。
6、向⽂件写⼊⼀个字符串:
f.write(s)
参数:  s 为要写⼊的字符串
说明: (1)⽂件写⼊后,⽂件的指针向后移动 len(s) 字节。
(2)如果磁道已坏,或磁盘已满会发⽣异常。
读⽂件
打开⼀个⽂件⽤open()⽅法(open()返回⼀个⽂件对象,它是可迭代的):
f = open('', 'r')
r表⽰是⽂本⽂件,rb是⼆进制⽂件。(mode参数默认值就是r)
如果⽂件不存在,open()函数就会抛出⼀个IOError的错误,并且给出错误码和详细的信息告诉你⽂件不存在:
>>> f=open('', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: ''
⽂件使⽤完毕后必须关闭,因为⽂件对象会占⽤操作系统的资源,并且操作系统同⼀时间能打开的⽂件数量也是有限的
>>> f.close()
python⽂件对象提供了三个“读”⽅法: read()、readline() 和 readlines()。每种⽅法可以接受⼀个变量以限制每次读取的数据量。
read() 每次读取整个⽂件,它通常⽤于将⽂件内容放到⼀个字符串变量中。如果⽂件⼤于可⽤内存,为了保险起见,可以反复调
⽤read(size)⽅法,每次最多读取size个字节的内容。
readlines() 之间的差异是后者⼀次读取整个⽂件,像 .read() ⼀样。.readlines() ⾃动将⽂件内容分析成⼀个⾏的列表,该列表可以由 Python 的 for ... in ... 结构进⾏处理。
readline() 每次只读取⼀⾏,通常⽐readlines() 慢得多。仅当没有⾜够内存可以⼀次读取整个⽂件时,才应该使⽤ readline()。
注意:这三种⽅法是把每⾏末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们⼿动去掉。
举例:
with open('f.txt', 'r', encoding='utf-8') as f1:
list1 = f1.readlines()
print(list1) # ['sdfasdasf\n', 'dfgsd\n', '231\n', '3789\n', '1312\n']
去掉'\n':
with open('f.txt', 'r') as f1:
list1 = f1.readlines()
for i in range(0, len(list1)):
list1[i] = list1[i].rstrip('\n')
print(list1) # ['sdfasdasf\n', 'dfgsd\n', '231\n', '3789\n', '1312\n']
对于read()和readline()也是把'\n'读⼊了,但是print的时候可以正常显⽰(因为print⾥的'\n'被认为是换⾏的意思)
with open('f.txt', 'r') as f1:
list1 = f1.read()
print(list1)
print('*'*100)
with open('f.txt', 'r') as f1:
list1 = f1.readline()
print(list1)
运⾏结果:
sdfasdasf
dfgsd
231
3789
1312
****************************************************************************************************
sdfasdasf
写⽂件
写⽂件和读⽂件是⼀样的,唯⼀区别是调⽤open()函数时,传⼊标识符'w'或者'wb'表⽰写⽂本⽂件或写⼆进制⽂件:
f = open('', 'w') # 若是'wb'就表⽰写⼆进制⽂件
f.write('Hello, world!')
f.close()
注意: 'w'这个模式是这样:
  ①如果没有这个⽂件,就创建⼀个;
  ②如果有这个⽂件,那么就会先把原⽂件的内容清空再写⼊新的东西。
③如果不想清空原来的内容⽽是直接在后⾯追加新的内容,就⽤'a'这个模式。
我们可以反复调⽤write()来写⼊⽂件,但是务必要调⽤f.close()来关闭⽂件。当我们写⽂件时,操作系统往往不会⽴刻把数据写⼊磁盘,⽽是放
到内存缓存起来,空闲的时候再慢慢写⼊。
只有调⽤close()⽅法时,操作系统才保证把没有写⼊的数据全部写⼊磁盘。
忘记调⽤close()的后果是数据可能只写了⼀部分到磁盘,剩下的丢失了。
所以,还是⽤with语句来得保险:
with open('', 'w') as f:
f.write('Hello, world!')
python⽂件对象提供了两个“写”⽅法: write() 和 writelines() 。
write()⽅法和read()、readline()⽅法对应,是将字符串写⼊到⽂件中。
writelines()⽅法和readlines()⽅法对应,也是针对列表的操作。它接收⼀个字符串列表作为参数,将他们写⼊到⽂件中,换⾏符不会⾃动的加⼊,因此,需要显式的加⼊换⾏符。
f1 = open('', 'w')
f1.writelines(["1", "2", "3"])
#    此时的内容为:123
f1 = open('', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
#    此时的内容为:
#    1
#    2
#    3
关于open()的mode参数
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,⽂件若不存在就报错(IOError))
'w+' == w+r(可读可写,⽂件若不存在就创建)
'a+' == a+r(可追加可写,⽂件若不存在就创建)
对应的,如果是⼆进制⽂件,就都加⼀个b就好啦:'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'
file_obj.seek(offset,whence=0)
file_obj.seek(offset,whence=0) ⽅法⽤来在⽂件中移动⽂件指针。
参数:offset表⽰偏移多少。可选参数whence表⽰从哪⾥开始偏移,默认是0为⽂件开头,1为当前位置,2为⽂件尾部。
举例:
f = open("", "a+")
ad())
f.write('1')
f.seek(0, 0)# 把⽂件指针从末尾移到开头,没有这句话下⾯的read()就读不到正确的东西
ad())
f.close()
注意:这个⽂件指针的改变只是作⽤于'r',对'w'和'a'不会起作⽤,如果是'w',那么write()永远都是从开头写(会覆盖后⾯对应位置的内容),是'a'的话write()就永远都是从最后开始追加。
字符编码
要读取⾮UTF-8编码的⽂本⽂件,需要给open()函数传⼊encoding参数;
例如,读取GBK编码的⽂件:
f = open('', 'r', encoding='gbk')
ad())
遇到有些编码不规范的⽂件,你可能会遇到UnicodeDecodeError,因为在⽂本⽂件中可能夹杂了⼀些⾮法编码的字符。遇到这种情况,open()函数还接收⼀个errors参数,表⽰如果遇到编码错误后如何处理。
最简单的⽅式是直接忽略:
f = open('', 'r', encoding='gbk', errors='ignore')
⽂件内容替换
举例:
错误写法:
def modify_text():
with open('', "r+") as f:
read_data = f.read()
f.write(place('apple', 'android'))
执⾏上⾯这个函数,它会把内容追加进去,⽽不是替换。
正确写法:
需要加上f.seek(0),把⽂件定位到 position 0,没有这句的话,⽂件是定位到数据最后,truncate也是从这⾥删除,所以感觉就是没起作⽤。
def modify_text():
with open('', "r+") as f:
read_data = f.read()
f.seek(0)
f.write(place('apple', 'android'))
综合实例
解析⽂件模式a+读取不了⽂件
f = open('', 'a+', encoding='utf-8')
adline())
最终的执⾏结果是输出空,为什么呢?
原因:a+模式打开⽂件指针在⽂件结尾处,所以直接读是读不到内容的
解释:如下代码
f = open('', 'a+', encoding='utf-8')
ll())
最终输出是28,通常如果要读取完整的⽂件这个值应该是0开始,这代表⽂件指针当前所处位置,现在28已经是⽂件结尾的位置了,所以⼀个字符都读取不了,那我们要怎么做呢?
f = open('', 'a+', encoding='utf-8')
f.seek(0)
adline())
将⽂件指针重置指向⽂件头即可!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。