python-文件处理

#文件的读写:

## r:只读

f = open('File.txt','r')  # r:只读
data = f.read()
print(data)
f.close()       #及时关闭,释放内存

  open函数默认即为只读模式,故其中的 ' r ' 可不写。文件访问结束后要及时close()。

## w:覆盖文件原始数据后写入新数据

f = open('File.txt','w')           #'w':覆盖原数据来写入。
f.write('hahaha\n')
f.write('ha\n123\n345\n')
f.writelines(['asd\n','123','1'])  #只能是字符串
f.close()

  在‘w’条件下,若open函数指定的文件不存在,则会新建一个该文件来写入数据。

## a:不覆盖原始数据,只在原始数据后追加新数据(不可读)

f = open('File.txt','a')

  其它操作方法同 ' w '。

 

# 使用with as 语句可避免使用f.close()

 

with open('new.txt', 'w') as f:    #等效于f = open('new.txt', 'w')
    f.write('hahaha\n')
with open('new.txt') as f:
    print(f.read())

 

 #文件在b模式下的读写:

  b模式即以字节的方式来读写文件,b模式下的open函数无法指定其编码方式。在b模式下,就要常常对字符串和字节进行编码(encode)或解码(decode)转换:

字符串------encode-----> bytes

bytes -------decode-----> 字符串

 ## rb:以字节方式读文件

  新建File.txt文件,其内容为:

    123

    你好啊

 

f = open('File.txt','rb')   #不能指定编码方式,即不能添加encoding:'xxx'
print(f.read())
print(f.read().decode('gbk'))

 

  上面第一个print是直接输出 f 的内容,故其输出结果为字节方式的文件内容,结果如下:

b'123\r\n\xc4\xe3\xba\xc3\xb0\xa1'   #\r\n即回车,在linux中是\n

  如果想要输出其原本的数据形式,则需要解码(decode)来实现,即第二个print。此处我们用了 ‘gbk’ 编码来解码,其结果如下:

123
你好啊

 

## wb:以字节方式写文件

f = open('test.py','wb')

  在以字节方式写入文件内容时,要注意写入的数据必须是字节格式,字符串是不能写入二进制文件的。所以当写入字符串时:

f.write('123\n')

  程序会立刻报错:

TypeError: a bytes-like object is required, not 'str'

  正确写入文件主要有如下两种方式:

 

f.write(bytes('你好\n', encoding = 'utf-8'))  #bytes()可将字符串按照指定编码(此处为'utf-8')转换成字节形式
f.write('1111\n'.encode())         #此处使用的是encode来将字符串编码成pytes

 

 

#其它文件操作方法:

f.flush()     #刷新,以在写了一堆数据后保存文件,类似于系统快捷键Ctrl+S
f.seek(3)    #将文件里的光标位置从开头移动3个字节
f.seek(-3,2)  #此处2代表从文件末尾移动光标,-3说明向前移动三个字节。(注意:在2模式下,第一个参数一定要加上-号)

#循环文件的推荐方式:
f = open('a.txt','r')
for i in f:   
    print(i)
'''
这种方式循环时,是从文件中每次拿一行数据,若使用:
for i in f.readlines():
    print(i)
则程序会先生成一个包含了文件全部数据的列表,然后在列表中每次拿一行。因此在有些情况下会占用较大内存,产生浪费。
'''

 

posted @ 2018-11-22 00:30  馭龍  阅读(183)  评论(0编辑  收藏  举报