Python笔记 —— 使用open打开和操作txt文件

打开:有两种方式

with open(r"data.txt", "r", encoding="utf-8") as f: 
f = open(r"data.txt", "r", encoding="utf-8")
f.close()

1.使用with管理文件,可以在不需要使用时自动关闭文件。

2.第一个参数是需要打开文件的位置,可以用相对路径或者绝对路径表示,如果文件与当前文件在同一级目录中,直接写文件名可以

3.文件路径前的r表示禁用转义,即如果文件名中出现 符号,会被识别成普通字符而非转义符

4.第二个参数"r"代表打开模式,打开模式有以下几种

  • "r"只读,该文件必须已存在。
  • "r+"可读可写。该文件必须已存在,写为追加在文件内容末尾
  • "rb":  表示以二进制方式读取文件。该文件必须已存在。
  • "w":  只写。打开即默认创建一个新文件,如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。
  • "w+"写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写。
  • "wb":  表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
  • "a"追加写。若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。
  • "a+"追加读写。打开文件方式与写入方式和'a'一样,但是可以读。需注意的是你若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。(可以用seek()方法解决这个问题)

5.关键字参数encoding是可选参数,当文档中没有中文字符时可以不用写这个参数,当有中文字符时才需要写(这是因为Windows的默认编码格式是GBK,而python的默认编码格式是Unicode.utf-8)

操作:主要有读和写两部分

读取数据有两种常见情况,第一种是逐行读取,第二行是逐个数据读取

逐行读取数据,以以下数据为例

zhangsan   1535198308152190   F   69
lisi       1535198106072191   F   91
wangwu     1535198903072192   M   87
xiaoming   1535198811022193   M   76
xiaohong   1535198301262194   F   55

处理方法如下:

with open(r"data.txt", "r", encoding="utf-8") as f:
    for line in f:
        data = line.strip("
").split()
        print(data)
'''
输出:
['zhangsan', '1535198308152190', 'F', '69']
['lisi', '1535198106072191', 'F', '91']
['wangwu', '1535198903072192', 'M', '87']
['xiaoming', '1535198811022193', 'M', '76']
['xiaohong', '1535198301262194', 'F', '55']
'''

注意:1.逐行读取文件会把每一行最后的换行符也读取进字符串中,比如上文中for循环读取或者用f.getline()读取都会有这个问题,因此需要使用strip函数把头尾的换行符都去掉(实际上只有尾部有)

   2.对于以空格分隔数据的字符串,默认无参的split()函数可以做到以任意多个空格为分界分割字符串,并把空格全部删除。如果split()中传入一个字符串作为参数,则split函数会以这个字符串作为标准分割,但是并不会过滤掉分割符。举例如下:

   如果把第三行改成    data = line.strip(" ").split(“ ”)

     输出结果的第一行将会是 ['zhangsan', '', '', '1535198308152190', '', '', 'F', '', '', '69']  ,这时需要自己手动删除元素 “ ”

最后,读取出来的全部都是字符串,需要手动转换成其他类型的值

逐个数据读取

with open(r"data.txt", "r", encoding="utf-8") as f:
    data = f.read().split()

read可以把整个文件的内容都读取出来,read()中可以加一个参数int n,表示读取文件中的前n个字符,适用于文本中没有换行符的情况

原文地址:https://www.cnblogs.com/LC32/p/13258596.html