打开:有两种方式
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个字符,适用于文本中没有换行符的情况