python之文件处理

文件处理流程

1.打开文件,得到文件语句柄 并赋值给一个变量

2.通过语句柄对文件进行操作

3.关闭文件

基本操作

读操作

fn=open('test.txt')
data=fn.read()
print (data)
文件读操作,读出所有文件
fn=open('test.txt')
print(fn.readline())
print(fn.readline())
print(fn.readline())
一行一行的读文件。PS:print会自动换行,解决方法
print(fn.readline().strip('
'))
print(fn.readline().strip('
'))
print(fn.readline().strip('
'))
fn=open('test.txt')
print (fn.readable())
判断文件是否可读
fn=open('test.txt')
print (fn.readlines())
将文件以列表的方式读出

注意:读一行,光标向下移动一行。如果上面的操作读三行,那么再以readlines的方式查看就不会是所有的行都以列表的方式读出

fn=open('test.txt')
print(fn.readline().strip('
'))
print(fn.readline().strip('
'))
print (fn.readlines())


111111111111111111111111111
2222222222222222222222
['333333333333333333333333
', '4444444444444444444
', '555555555555555555
', '666666666666666
']
fn=open('test.txt')
for  line in fn.readlines():
    print (line).strip('
')
循环文件,效率不高
fn=open('test.txt')
for line in fn:
    print (line).strip('
')
使用这种方法循环文件,则没问题。这是一个非常厉害的功能(迭代器),后续的文章会介绍

注意:每次在操作完文件后都要进行一次fn.close(文件关闭操作)。如果不关闭,则很会占用内存,一定要及时释放掉

上下文管理操作

with open('test.txt') as fn:
    print (fn.readlines())
打开文件操作后无需关闭

写操作

在上面的例子中fn=open('test.txt')其实是可以在后面跟参数,写操作后面需要跟上'w',而读操作则不需要写,默认就是读操作.例子读fn=open('test.txt','r')

写fn=open('test.txt','w')

fn=open('test.txt','w')
写操作,如果有这个文件,会将原来的文件进行覆盖。没有这个文件则创建
fn=open('test2.txt','r')  
读操作,如果有这个文件,则可以读。没有这个文件则报错。
fn=open('test1.txt','w')
print (fn.writeable())
判断文件是否可写
fn=open('test1.txt','w')
print(fn.write('111
'))
print(fn.write('222 333 ')) 写文件,并返回写入几个字符
fn=open('test1.txt','w')
fn.writelines(['1111
','aaaa
','bbbb
'])
fn.close()

注意,每次在操作文件结束后都要关闭文件哦!

 测试

 模仿vim更改文件内容

hello aaa
hello bbb
hello ccc
hello ddd
old文件
import os                                     #导入os模块为下面改名做准备
old_fn=open('old','r')                         #读取源文件old
new_fn=open('new','w')                         #打开新文件
for old_line in old_fn:                       #将文件中的行遍历出来
    if old_line == 'hello aaa
':             #匹配要修改的行
        new_fn.write('hello 111
')           #将修改的文件写入新文件
        continue                             #想要修改的行结束后,跳过循环
    new_fn.write(old_line)                    #将不需要修改的文件写入新文件
old_fn.close()                                #关闭文件
new_fn.close()

os.rename('old','.old.swp')                    #使用os模块将源文件改名
os.rename('new','old')                         #将新文件改为源文件名
使用上下文的方式来打开文件与关闭文件,就可以省略close的步骤
import
os with open('old','r') as old_fn: with open('new','w') as new_fn: for old_line in old_fn: if old_line == 'hello aaa ': new_fn.write('111 ') continue new_fn.write(old_line) os.rename('old','.old.swp') os.rename('new','old')

注意:没有直接对硬盘文件修改那么一说。所有的文件修改都是将源文件从硬盘中读取到内存中,然后使用软件进行修改,将修改后的文件在刷回硬盘,覆盖源文件。切记!!!

文件处理高级操作

with open('a.txt','wb') as f:  #wb是打开一个文件以二进制形式写文件
    f.write('asdasdsa')

#上面输出会报错

Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled/day9/內建函数.py", line 18, in <module>
    f.write('asdasdsa')
TypeError: a bytes-like object is required, not 'str'

#格式不
with open('a.txt','wb') as f:
    f.write(bytes('asdsdasd',encoding='utf-8'))
#需要将文件的格式改变成bytes才能写入

 这样的好处是可以跨平台

with open('a.txt','rb') as f:
    print(f.read())

#如果想要通过rb查看文件,那么将会看到一堆二进制

b'xe4xbdxa0xe5xa5xbdxe5x82xbbxe9x80xbcdasd'

 如果想要看到正常的文件,那么既然有编码就要用解码(用什么格式编码就用什么格式解码)

with open('a.txt','rb') as f:
    print(f.read().decode(encoding='utf-8'))

其他操作(并不常用)

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:

r ,只读模式  #默认模式,文件必须存在,不存在则抛出异常
w,只写模式  #不可读;不存在则创建;存在则清空内容
x, 只写模式  #不可读;不存在则创建,存在则报错
a, 追加模式  #可读;   不存在则创建;存在则只追加内容
"+" 表示可以同时读写某个文件

r+, 读写 #可读,可写
w+,写读 #可读,可写
x+ ,写读 #可读,可写
a+, 写读 #可读,可写
 "b"表示以字节的方式操作

rb  或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

 进度条

#进度条
import sys,time
for i in range(10):     #循环输出10个#
    sys.stdout.write('#')   #sys.stdout跟print一样都是输出,只不过print是封装后输出
    sys.stdout.flush()  #sys.stdout.flush,将写入的文件刷出来,注意是不换行
    time.sleep(0.2)         #然后间隔0.2秒.一般来说这个间隔是看程序的运行或者启动时间来算的

 文件位置(seek)

abc
def
ghi
jkl
mno
测试代码
with open('a.txt','r') as f:
    print(f.tell())             #查看当前光标位置
    print(f.read(2))            #读字符后面的数字是读取几个字符
    print(f.tell())             #读取之后光标就会移动
    f.seek(0)    #移动光标到0
    print('===================>')
    print(f.read())             #光标移动到0后,再次read会读出所有
    #seek移动光标需要参照物,默认情况下参照物为开头,实际上seek有两个参数
    print('===================>')
    f.seek(0)
    print(f.tell())
    f.seek(0,2)       #则代表参照开头移动一个光标,后面的数据代表三种模式分别为0,1,2
    print(f.tell())
常用操作1
with open('a.txt','r+') as f:
    f.truncate(3)                   #truncate截断属于写文件用r+用w直接清空文件

#常用的就r,a,w
原文地址:https://www.cnblogs.com/charles1ee/p/6394874.html