读取文本文件
读取文本文件的基本函数
- 以只读模式打开文件:r代表读取模式,若文件不存在则会报错。
fp = open("iris.txt", "r")
print(file)
out: <_io.TextIOWrapper name='iris.txt' mode='r' encoding='UTF-8'>
- 一次读入文件的一行,然后“游标"自动转到文件的下一行首
fp.readline() # 读取一行
'150\t4\tsetosa\tversicolor\tvirginica\n'
fp.readline() #再一次调用,则已经读到下一行
'5.1\t3.5\t1.4\t0.2\t0\n'
- 一次读取到文件末尾
fp.readlines()
['4.9\t3\t1.4\t0.2\t0\n',
'4.7\t3.2\t1.3\t0.2\t0\n',
'4.6\t3.1\t1.5\t0.2\t0\n',
......
'6.5\t3\t5.2\t2\t2\n',
'6.2\t3.4\t5.4\t2.3\t2\n',
'5.9\t3\t5.1\t1.8\t2\n']
- 将游标跳到文件开始位置
fp.seek(0) # 将游标跳到第一行再读取一行,则又读到了文件的第一行
fp.readline()
'150\t4\tsetosa\tversicolor\tvirginica\n'
- close关闭文件
fp.close() # 关闭文件后再次读取就会报错:在关闭的文件上进行IO操作
fp.readline()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-f83b4d936024> in <module>
1 fp.close()
----> 2 fp.readline()
ValueError: I/O operation on closed file.
三种读取文本文件全部数据的方法
-
- 打开文件,利用while循环,一行行的readline
fp = open("iris.txt", "r")
line = fp.readline()
while line:
print(line) #因为是使用print打印输出,\n等转义符号都已转义后输出,不再保持原样
line = fp.readline()
fp.close()
150 4 setosa versicolor virginica
5.1 3.5 1.4 0.2 0
4.9 3 1.4 0.2 0
......
5.9 3 5.1 1.8 2
-
- 打开文件,通过for in循环来遍历文件指针来获取文件的每一行
fp = open("iris.txt")
for line2 in fp: # 遍历的是文件指针,能够自动获得每一行的内容
print(line2)
fp.close()
150 4 setosa versicolor virginica
5.1 3.5 1.4 0.2 0
4.9 3 1.4 0.2 0
4.7 3.2 1.3 0.2 0
.......
5.9 3 5.1 1.8 2
-
- 打开文件,先读取文件的全部内容(readlines)存入一个对象中,然后通过for in循环遍历这个对象,获取每一行的内容
fp = open("iris.txt")
lines = fp.readlines()
for line in lines: #遍历的是存储所有文件内容的对象
print(line)
fp.close()
150 4 setosa versicolor virginica
5.1 3.5 1.4 0.2 0
4.9 3 1.4 0.2 0
.......
5.9 3 5.1 1.8 2
读取CSV文件
读取CSV文件的基本函数
- 导入Pandas包(需要提前安装好,我是使用Anaconda管理这些包)
import pandas as pd
- 采用pandas中的函数将csv表格形式文件直接读取到一个Pyhton的DataFrame对象中,常用的函数有read_csv和read_table函数
df = pd.read_csv('iris.csv') # 结果存储在DataFrame对象中
df # 直接查看DataFrame对象中内容
150 | 4 | setosa | versicolor | virginica | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
... | ... | ... | ... | ... | ... |
145 | 6.7 | 3.0 | 5.2 | 2.3 | 2 |
146 | 6.3 | 2.5 | 5.0 | 1.9 | 2 |
147 | 6.5 | 3.0 | 5.2 | 2.0 | 2 |
148 | 6.2 | 3.4 | 5.4 | 2.3 | 2 |
149 | 5.9 | 3.0 | 5.1 | 1.8 | 2 |
150 rows × 5 columns
-
最左列为自动生成的索引
-
DataFrame对象非常适合处理表格数据
-
read_table
不仅可以读取csv文件(以,分隔的表格型文件),还可以读取以其它方式分隔的表格,所以需要设置分隔符
df = pd.read_table("iris.csv", sep = ',') # 设置分隔符为,,才能处理csv文件
df
150 | 4 | setosa | versicolor | virginica | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
... | ... | ... | ... | ... | ... |
145 | 6.7 | 3.0 | 5.2 | 2.3 | 2 |
146 | 6.3 | 2.5 | 5.0 | 1.9 | 2 |
147 | 6.5 | 3.0 | 5.2 | 2.0 | 2 |
148 | 6.2 | 3.4 | 5.4 | 2.3 | 2 |
149 | 5.9 | 3.0 | 5.1 | 1.8 | 2 |
150 rows × 5 columns
逐块的读取文件(一次读取其中几行):
- 逐块读取文件的两种方法
- 设置nrows参数
- 或者chunksize参数,但是将文件按块存储在一个TextParser对象中
read_table
设置nrows参数
df5 = pd.read_table('iris.csv', sep = ',', nrows=5)
df5
150 | 4 | setosa | versicolor | virginica | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
read-_csv
设置nrows参数
df5 = pd.read_csv("iris.csv", nrows=5)
df5
150 | 4 | setosa | versicolor | virginica | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
read_csv
函数设置chunksize参数
chunk = pd.read_csv("iris.csv", chunksize=5)
chunk
<pandas.io.parsers.TextFileReader at 0x7f824f359cd0>
- 使用设置chuncksize参数生成的textparser对象对文件进行逐块迭代
tot = 0
for piece in chunk:
tot = tot + 1
print(piece)
print("-------")
print(tot) # 总共有150行,每5行一块有30块,存储在这些块存储在chunk对象中
150 4 setosa versicolor virginica
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
-------
150 4 setosa versicolor virginica
5 5.4 3.9 1.7 0.4 0
6 4.6 3.4 1.4 0.3 0
7 5.0 3.4 1.5 0.2 0
8 4.4 2.9 1.4 0.2 0
9 4.9 3.1 1.5 0.1 0
-------
.......
150 4 setosa versicolor virginica
145 6.7 3.0 5.2 2.3 2
146 6.3 2.5 5.0 1.9 2
147 6.5 3.0 5.2 2.0 2
148 6.2 3.4 5.4 2.3 2
149 5.9 3.0 5.1 1.8 2
-------
30
写入文本文件
- 创建文件对象,使用w模式写入,w模式是覆盖式写入,一旦用w模式打开文件,文件中之前的内容全都删除了,若文件不存在则会先创建再写入。
myData = ['Date', 'Time'] #创建测试的数据
myfile = open("test.txt",'w') #用w模式打开文件
for line in myData:
myfile.write(line+'\n')
myfile.close()
- 以r模式打开文件,检查写入文件是否成功
myfile = open("test.txt", 'r')
print(myfile.read())
Date
Time
- 使用a模式可以追加写
print("写之前输出:")
myfile1 = open("test.txt", 'r')
print(myfile1.read())
myfile2 = open("test.txt", 'a')
myfile2.write("a")
print("写之后输出:")
myfile3 = open("test.txt", 'r')
print(myfile3.read())
写之前输出:
Date
Time
写之后输出:
Date
Time
a