Python入门教程[5]-文件处理

  • A+
所属分类:python快速入门
摘要这一篇文章会介绍在python中如何实现文件的打开,关闭,写入等操作,对于之后的应用是很有帮助的。

打开关闭文件

我们使用open函数打开文件夹,open需要两个参数,第一个参数是文件路径或者文件名,第二个是文件打开的模式。模式有如下的选项:

  • "r",以只读模式打开,你只能读取文件但不能编辑/删除文件的任何内容
  • "w",以写入模式打开,如果文件存在将会删除里面的所有内容,然后打开这个文件进行写入
  • "a",以追加模式代开,写入到文件中的任何数据将自动添加到末尾
  • "b",以二进制的方式打开

默认为只读模式。

我们下面看一个例子:

  1. file = open('byr.py','r') #打开文件
  2. file.readlinereadline() #读取文件的一行
  3. >> #这里会输出文件第一行的内容
  4. file.close()#记得文件打开后要关闭

在实际情况中,我们会采取with语句处理文件对象,他会在文件用完之后自动关闭。下面我们来看一个例子。

  1. with open('byr.py') as file:
  2.     count=0
  3.     for line in file:
  4.         print(line) #每一行打印文件内容
  5.         count = count+1
  6.     print(count) #输出文件总行数

我们在上面这个程序中没有使用close,但是程序在执行到with代码块之外的时候,文件会被自动关闭。

读取文件内容

在上面其实已经讲到了一些关于文件内容读取的内容,即readline,这里在把文件内容读取讲得详细一点。

下面介绍三个常用的函数

  • read() 读取整个文件,要谨慎使用,可能文件过大
  • readline 每次读取文件的一行
  • readlines 读取文件的所有行,返回一个列表,列表中每个元素对应文本中的一行字符串

其实,在使用with的时候,返回的file已经可以直接进行文件每一行的读取了.

  1. with open('byr.py') as file:
  2.     print(file)
  3.     print(list(file)) #可以显示每一行的内容
  4.     for line in file:
  5.         print(line) #这样就可以输入文件的每一行

写入文件

写入文件最常用的方法是write(),下面看一个例子

  1. with open('byr.txt','w') as file:
  2.     file.write('byr test')#这样默认是不换行的
  3.     file.write('byr test \n') #这样就是换行的
  4.     file.write('byr test')

上面这个程序我们使用w模式打开,如果文件不存在就会新建,如果文件存在就会把原来的内容覆盖掉。

那么要是我们想要向文件里增加内容应该怎么办呢?我们可以使用a追加模式打开文件:

  1. with open('byr.txt','a') as file:
  2.     file.write('byr test')#这样默认是不换行的
  3.     file.write('byr test \n') #这样就是换行的
  4.     file.write('byr test \n')

os.path文件与文件夹操作

下面介绍os.p这个常用的标准库,这个库主要是用于处理文件和文件夹,下面举一些常用的用法.

  • os.path.abspath(path) 返回文件的绝对路径
  • os.path.basename(path) 返回文件名
  • os.path.dirname(path) 返回文件路径
  • os.path.isfile(path) 判断路径是否为文件
  • os.path.isdir(path) 判断路径是否为目录
  • os.path.exists(path) 判断路径是否存在
  • os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
  1. import os
  2. filename = '/home/wmn/byr.py'
  3. print(os.path.abspath(filename))#返回文件的绝对路径
  4. >> '/home/wmn/byr.py'
  5. print(os.path.basename(filename))#返回文件名
  6. >> 'byr.py'
  7. print(os.path.dirname(filename))#返回文件的路径
  8. >> '/home/wmn'
  9. print(os.path.isfile(filename))#判断是否是文件
  10. >> True
  11. print(os.path.isdir(filename))#判断是否是目录
  12. >> False
  13. print(os.path.exists(filename))#判断路径是否存在
  14. >> True
  15. print(os.path.join('/home/wmn','byr.txt'))#把目录和文件名合在一起
  16. >> '/home/wmn/byr.txt'

 

这个还是很常用的,更多的内容可以查看文档。

同时打开多个文件

我们可以使用with来打开多个文件,下面介绍两种写法:

方法一:

  1. with open('file1') as f1, open('file2') as f2, open('file3') as f3:
  2.     for i in f1:
  3.         j = f2.readlinereadline()
  4.         k = f3.readlinereadline()
  5.         print(i,j,k)

 方法二:

  1. from contextlib import nested
  2. with nested(open('file1'), open('file2'), open('file3')) as (f1,f2,f3):
  3.     for i in f1:
  4.         j = f2.readlinereadline()
  5.         k = f3.readlinereadline()
  6.         print(i,j,k)

一次读取文件N行

有的时候我们会遇到文件比较大,不能一次性全部读取,需要N行读一次,下面介绍一下方法:

  1. with open(...) as f:
  2.     while True:
  3.         next_n_lines = list(islice(f, n))
  4.         if not next_n_lines:
  5.             break
  6.         else:
  7.             # process next_n_lines

一个详细的例子可以参考:Python多进程用法中的文件处理的例子。

文件内容修改

有的时候我们需要对源文件进行一些修改,可以使用如下的方式进行修改。

  1. def alter(file,old_str,new_str):
  2.     """
  3.     替换文件中的字符串
  4.     :param file:文件名
  5.     :param old_str:就字符串
  6.     :param new_str:新字符串
  7.     :return:
  8.     """
  9.     file_data = ""
  10.     with open(file, "r", encoding="utf-8") as f:
  11.         for line in f:
  12.             if old_str in line:
  13.                 line = line.replace(old_str,new_str)
  14.             file_data += line
  15.     with open(file,"w",encoding="utf-8") as f:
  16.         f.write(file_data)
  17. alter("./20190301.csv", "\,", ",")

获取文件夹内所有文件

这一部分可以查看,Python入门教程[7]-常用模块中的os模块的使用。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: