参考文章:python文件读写小结 - 周洋 - 博客园

Python读取文件的几种方法 - poowicat - 博客园

python读取文件 - 刘丧失 - 博客园

Python File(文件) 方法 | 菜鸟教程

目录

一、简介

二、示例

2.1 读文件

2.2 面试题示例:

2.3 写文件

三、代码示例:

四、读取csv文件

4.1 用csv库进行读取

4.2 用pandas库的csv_read函数读取

4.3 读取一部分数据

4.3.1. 读取某一列的数据

4.3.2 读取某一行的数据

4.3.3 将数据写入CSV文件:


一、简介

Python读取文件,完整的语法格式:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

mode 参数: 

默认为文本模式,如果要以二进制模式打开,加上 b 。

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

file 对象 :

序号 方法及描述
1

file.close()

关闭文件。关闭后文件不能再进行读写操作。

2

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

3

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

4

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

5

file.next()

返回文件下一行。

6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

7

file.readline([size])

读取整行,包括 "\n" 字符。

8

file.readlines([sizeint])

读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。

9

file.seek(offset[, whence])

设置文件当前位置

10

file.tell()

返回文件当前位置。

11

file.truncate([size])

截取文件,截取的字节通过size指定,默认为当前文件位置。

12

file.write(str)

将字符串写入文件,返回的是写入的字符长度。

13

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

二、示例

2.1 读文件

打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的):

# r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)
f = open('test.txt', 'r')

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息说明文件不存在:

f=open('test.txt', 'r')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:f = open('/path/to/file', 'r')print(f.read())
finally:if f:f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open('/path/to/file', 'r') as f:print(f.read())

python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。

  • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
  • readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
  • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。

注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们手动去掉:

In[2]: with open('test1.txt', 'r') as f1:list1 = f1.readlines()
In[3]: list1
Out[3]: ['111\n', '222\n', '333\n', '444\n', '555\n', '666\n']  

去掉'\n'

In[4]: with open('test1.txt', 'r') as f1:list1 = f1.readlines()
for i in range(0, len(list1)):list1[i] = list1[i].rstrip('\n')
In[5]: list1
Out[5]: ['111', '222', '333', '444', '555', '666']

对于read()和readline()也是把'\n'读入了,但是print的时候可以正常显示(因为print里的'\n'被认为是换行的意思):

In[7]: with open('test1.txt', 'r') as f1:list1 = f1.read()
In[8]: list1
Out[8]: '111\n222\n333\n444\n555\n666\n'
In[9]: print(list1)
111
222
333
444
555
666In[10]: with open('test1.txt', 'r') as f1:list1 = f1.readline()
In[11]: list1
Out[11]: '111\n'
In[12]: print(list1)
111

2.2 面试题示例:

有两个文件,每个都有很多行ip地址,求出两个文件中相同的ip地址:

要点:

  1. 用with
  2. 处理行末的'\n'
  3. 使用二分查找提高算法效率。
  4. 使用set快速去重
# coding:utf-8
import bisectwith open('test1.txt', 'r') as f1:list1 = f1.readlines()
for i in range(0, len(list1)):list1[i] = list1[i].strip('\n')
with open('test2.txt', 'r') as f2:list2 = f2.readlines()
for i in range(0, len(list2)):list2[i] = list2[i].strip('\n')list2.sort()
length_2 = len(list2)
same_data = []
for i in list1:pos = bisect.bisect_left(list2, i)if pos < len(list2) and list2[pos] == i:same_data.append(i)
same_data = list(set(same_data))
print(same_data)

2.3 写文件

写文件和读文件相同,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

>>> f = open('test.txt', 'w') # 若是'wb'就表示写二进制文件
>>> f.write('Hello, world!')
>>> f.close()

注意:'w'这个模式:如果没有文件,就创建一个;如果有,先把原文件的内容清空再写入新的内容。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式。

可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('test.txt', 'w') as f:f.write('Hello, world!')

python文件对象提供了两个“写”方法: write() 和 writelines():

  • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
  • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符:
f1 = open('test1.txt', 'w')
f1.writelines(["1", "2", "3"])
#    此时test1.txt的内容为:123# 需要显式的加入换行符
f1 = open('test1.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
#    此时test1.txt的内容为:
#    1
#    2
#    3

关于open()的mode参数

  • 'r':读
  • 'w':写
  • 'a':追加
  • 'r+' == r+w(可读可写,文件若不存在就报错(IOError))
  • 'w+' == w+r(可读可写,文件若不存在就创建)
  • 'a+' ==a+r(可追加可写,文件若不存在就创建)
  • 对应的,如果是二进制文件,就都加一个b:
    • 'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

file_obj.seek(offset,whence=0):

file_obj.seek(offset,whence=0)方法用来在文件中移动文件指针。offset表示偏移多少。可选参数whence表示从哪里开始偏移,默认是0为文件开头,1为当前位置,2为文件尾部。举例:


f = open("test1.txt", "a+")
print(f.read())
f.write('1')
f.seek(0, 0)# 把文件指针从末尾移到开头,没有这句话下面的read()就读不到正确的东西
print(f.read())
f.close()

注意:这个文件指针的改变只是作用于'r',对'w'和'a'不会起作用,如果是'w',那么write()永远都是从开头写(会覆盖后面对应位置的内容),是'a'时write()就永远都是从最后开始追加。

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

>>> f = open('test.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

遇到有些编码不规范的文件,可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

>>> f = open('test.txt', 'r', encoding='gbk', errors='ignore')

三、代码示例:

# -*- coding: utf-8 -*-# 一、使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
#
# 二、需要导入import os
#
# 三、下面是逐行读取文件内容的三种方法:# 方法一:
def read_line():f = open("a.txt", encoding='utf-8')  # 返回一个文件对象line = f.readline()  # 调用文件的 readline()方法while line:# print(line,)  # 后面跟 ',' 将忽略换行符print(line, end='')  # 在 Python 3 中使用line = f.readline()f.close()# 使用withwith open("a.txt", encoding='utf-8') as f1:line = f.readline()while line:# print(line,)  # 后面跟 ',' 将忽略换行符print(line, end='')  # 在 Python 3 中使用line = f.readline()# 方法二:
def read_line_demo2():for line in open("a.txt", encoding='utf-8'):print(line, )# 使用withwith open("a.txt", encoding='utf-8') as f1:print(f1.readline(), )# 方法三:readlines
def read_lines_demo():f = open("a.txt", "r", encoding='utf-8')lines = f.readlines()  # 读取全部内容 ,并以列表方式返回for line in lines:print(line)# 使用withwith open('test1.txt', 'r', encoding='utf-8') as f1:list2 = f1.readlines()for i in range(0, len(list2)):list2[i] = list2[i].strip('\n')# 方法四:(一次性读取整个文件内容:)
def read_whole_file_demo():file_object = open('a.txt', encoding='utf-8')try:all_the_text = file_object.read()print(all_the_text)finally:file_object.close()# 使用withwith open('test1.txt', 'r', encoding='utf-8') as f1:all_the_text = f1.read()print(all_the_text)# 五、区别对待读取文本和二进制:
def other():# 1、如果是读取文本# 读文本文件input = open('data', 'r')# 第二个参数默认为rinput = open('data')# 2、如果是读取二进制input = open('data', 'rb')# 读固定字节:chunk = input.read(100)if __name__ == '__main__':print('PyCharm')

四、读取csv文件

4.1 用csv库进行读取

import csvwith open('data.csv', 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)

4.2 用pandas库的csv_read函数读取

import pandas as pddf = pd.read_csv('data.csv')
print(df)

4.3 读取一部分数据

4.3.1. 读取某一列的数据

1> 直接读取

import csv
import pandas as pdwith open('test.csv','r') as f:reader = csv.reader(f)column = [row[1] for row in reader]print(column)

2>根据列属性读取

import pandas as pddatas = pd.read_csv('test.csv',usecols=['name','price','num'])
print(datas)

4.3.2 读取某一行的数据

要提取其中第二行,可以用下面的代码:

import csv
with open('A.csv','rb') as csvfile:reader = csv.reader(csvfile)for i,rows in enumerate(reader):if i == 2:row = rows
#coding = 'utf-8'
import csv
# 使用list,只能读取列,而且是全文读取,csv.reader会自动把CSV内容生成数组
'''
df = csv.reader(open('F:\c_database\c2015.csv'))
for data in df:print (data[3])
'''#如果要读取某行,必须将CSV内容生成 DICT字典(2维)
with open('F:\c_database\c2015.csv','r') as csvfile:reader = csv.DictReader(csvfile)for row in reader:if row['日期']  ==  '20150105':print (row)

4.3.3 将数据写入CSV文件: 

f = open('C2105_P.csv','w')
writer = csv.writer(f)
for i in X:writer.writerow(i)

4.3.4 Matlab读取CSV文件

1、用csvread函数
注意:csvread函数只试用与用逗号分隔的纯数字文件

第一种:M = CSVREAD(‘FILENAME’) ,直接读取csv文件的数据,并返回给M

第二种:M = CSVREAD(‘FILENAME’,R,C) ,读取csv文件中从第R-1行,第C-1列的数据开始的数据,这对带有头文件说明的csv文件(如示波器等采集的文件)的读取是很重要的。

第三种:M = CSVREAD(‘FILENAME’,R,C,RNG),其中 RNG = [R1 C1 R2 C2],读取左上角为索引为(R1,C1) ,右下角索引为(R2,C2)的矩阵中的数据。

Python读写文件(txt, csv等)小结相关推荐

  1. python导入csv文件-Python读写文件(csv、txt、excel)

    大家做在数据处理的时候,肯定难免会与文件交互,那么对于指定的文件类型,我们如何操作呢? 1.python读写csv文件 import csv #python2可以用file替代open with op ...

  2. Python 文件操作中的读写模式:open(path, ‘-模式-‘,encoding=‘UTF-8‘)+python读写文件txt +文本数据预处理

    python读写txt文件 文件的打开的两种方式f = open("data.txt","r") #设置文件对象 f.close() #关闭文件#为了方便,避免 ...

  3. python读写文件,CSV和Excel

    json是特殊的字符串. 其实,csv也是一种字符串文件的格式,它组织数据的语法就是在字符串之间加分隔符-行与行之间是加换行符,同列之间是加逗号分隔. csv格式文件可以用任意的文本编辑器打开(如记事 ...

  4. python文件读取输出-Python 读写文件中数据

    1 需求 在文件 h264.txt 中的数据如图1,读入该文件中的数据,然后将第1列的地址删除,然后将数据输出到h264_out.txt中: 图1 h264.txt 数据截图 图2 输出文件 h264 ...

  5. python读写文件的语句_用Python读写文件指南

    用Python读写文件(指南) [TOC] 使用Python最常见的任务之一是读取和写入文件.无论是写入简单的文本文件,读取复杂的服务器日志,甚至是分析原始字节数据,所有这些情况都需要读取或写入文件. ...

  6. python文件对象提供了3个读方法、分别是-Python读写文件模式和文件对象方法实例详解...

    本文实例讲述了Python读写文件模式和文件对象方法.分享给大家供大家参考,具体如下: 一. 读写文件模式 利用open() 读写文件时,将会返回一个 file 对象,其基本语法格式如: open ( ...

  7. python如何读写文件-Python读写文件

    python读写文件是很常见的操作,而多数情况下是对纯文件的读写操作. 我们先看一下,纯文本是如何进行读写操作的. """ created by nzh Date: 20 ...

  8. python写文件读文件-Python 读写文件和file对象的方法(推荐)

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  9. python读写文件实例_python读写文件的简单示例

    这篇文章主要为大家详细介绍了python读写文件的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧. 首先看一个例子: # 来自www.512 ...

最新文章

  1. <论文阅读>CascadePSP: Toward Class-Agnostic and Very High-Resolution Segmentation via Global and...
  2. iOS new 和 alloc的区别
  3. Cisco ASA防火墙常用命令
  4. 机器学习基石13-Hazard of Overfitting
  5. [html] 可以给内联元素设置宽和高吗?为什么?
  6. C# 淘宝商品微信返利助手开发-(四)返利助手开发(2)淘宝分享的内容如何只取淘口令
  7. 【文末有福利】量子计算是对计算本质的发现
  8. 2025.wireshark工具使用
  9. 手里有20万,你会选择银行理财还是基金?
  10. Android学习之Intent使用
  11. 冒泡排序和选择排序的实现与比较
  12. i3wmvim终极配置
  13. Android HttpClient 与JSON解析
  14. 斐讯k1刷入Breed以及openwrt的教程
  15. Basic grammar of Python day2
  16. 区块链公司BitFury与联合国合作开展哈萨克斯坦的森林项目
  17. 矩阵内积、外积(克罗内克积)和Hadamard积
  18. RK3288源码编译
  19. 好用的AndroidStudio插件推荐
  20. 170 FPS!YolactEdge:边缘设备上的实时实例分割,已开源!

热门文章

  1. final修饰的变量必须初始化吗?
  2. 接口测试入门番外篇——如何在谷歌浏览器中集成postman这款接口测试工具呢?
  3. Android版简历(二)
  4. 区块链对抑制公共部门的腐败有什么作用?
  5. 数据链路层的功能和以太网帧格式的总结
  6. Spring Web(第一部分)
  7. 利用Matlab将任意曲线旋转任意角度
  8. 关于ALEXA的流量排名的参数介绍
  9. 同步AD账户到MOSS中
  10. Arduino压电震动传感器(二)