python处理CSV文件
CSV (comma-separated values)文件是一种文本文件格式,允许以表格结构保存数据。这是一种流行的格式,用于从数据库和电子表格导出和导入数据,CSV 文件中的每条数据都用逗号 (,
) 分隔,例如,第一行数据可以选择用作标题,标明其下方的每一列数据:
Python 提供了CSV模块,用于以 CSV 格式读取、写入和执行其他形式的文件处理,内置库提供了可无缝处理 CSV 文件的函数和类。
csv.reader()
函数可以读取CSV文件,调用open()
函数生成的一个文件对象, csv.reader()
将返回一个读取器对象。读取器对象将迭代 CSV 数据的每一行,其中行作为字符串列表返回。import csv
# encoding是打开(读取)文件的编码方式
with open('D:\\work\\test\\csv\\books.csv',encoding='utf-8') as file_obj:
reader_obj = csv.reader(file_obj) # 以列表形式读取
print(reader_obj) # 返回读取器对象
for row in reader_obj: # 以list形式返回一行
print(row)
# 输出
<_csv.reader object at 0x00000234C16F6860>
['title', 'author']
['三体', '刘慈欣']
['呐喊', '鲁迅']
import csv
with open('books.csv','r',encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile) # 以字典形式读取
print(reader)
for i in reader:
print(i)
csv.writer()
函数使我们能够以CSV格式写入数据,以写入模式打开文件后,会返回一个编写器对象。writerow()
方法,用于写入单行数据(每次以逗号分隔的字符串或数值的可迭代值),而 writerows()
方法一次用于多行。import csv
with open('products.csv', 'w', newline='', encoding='utf-8') as file_obj:
# 不加入“newline=''”时,会隔行写入
writer_obj = csv.writer(file_obj)
# 一行一行写入
writer_obj.writerow(['Product Name','Price','Quantity','SKU Number'])
writer_obj.writerow(['Rice',80,35,'RI59023'])
writer_obj.writerow(['Curry',2,200,'CY13890'])
writer_obj.writerow(['Milk',9.5,315,'MK10204'])
# 使用多行写入
writer_obj.writerows([['Product Name','Price','Quantity','SKU Number'],
['Rice',80,35,'RI59023'],
['Curry',2,200,'CY13890'],
['Milk',9.5,315,'MK10204']])
open()
中的newline=''
参数,在写入时,若newline
是None, '\n', '\r', '\r\n',则隔行写入;若newline=''
,则“连续”写入。read_csv()
方法返回一个包含CSV文件数据的Pandas DataFrame对象,其中输入也可以时URL。head()
方法默认显示CSV文件的前五行,也可以自定义。header
是字段,如果header=1,将会以第二行作为字段名,读取第二行以下的数据import pandas as pd
data = pd.read_csv(r'books.csv')
print(type(data))
print(data)
# 默认输出前5行,也可以自定义
print(data.head())
print(data.head(3))
data = pd.read_csv(r'books.csv',header=1)
print(data.head(2))
# 输出
<class 'pandas.core.frame.DataFrame'>
title author
0 三体 刘慈欣
1 呐喊 鲁迅
2 三体 刘慈欣
3 呐喊 鲁迅
4 三体 刘慈欣
5 呐喊 鲁迅
title author
0 三体 刘慈欣
1 呐喊 鲁迅
2 三体 刘慈欣
3 呐喊 鲁迅
4 三体 刘慈欣
title author
0 三体 刘慈欣
1 呐喊 鲁迅
2 三体 刘慈欣
三体 刘慈欣
0 呐喊 鲁迅
1 三体 刘慈欣
read_csv()
方法将CSV文件第一行中的值视为列标题,也可以自定义标题,且将自定义列名称的列表传递给方法的names
属性,如果要覆盖默认的标头名称,则可以传递header=None
关键字参数。import pandas as pd
data = pd.read_csv(r'books.csv')
print(data.head(2))
col_names = ['Id','Survived']
data= pd.read_csv(r'books.csv', names=col_names, header=None)
print(data.head(2))
# 输出
title author
0 三体 刘慈欣
1 呐喊 鲁迅
Id Survived
0 title author
1 三体 刘慈欣
values
属性可以将读出的DataFrame对象转换为List形式。import pandas as pd
data = pd.read_csv(r'books.csv')
print(data)
list = data.values
print(list)
## 输出
title author
0 三体 刘慈欣
1 呐喊 鲁迅
2 三体 刘慈欣
3 呐喊 鲁迅
4 三体 刘慈欣
5 呐喊 鲁迅
[['三体' '刘慈欣']
['呐喊' '鲁迅']
['三体' '刘慈欣']
['呐喊' '鲁迅']
['三体' '刘慈欣']
['呐喊' '鲁迅']]
usecols
属性表示读取第几列。import pandas as pd
data = pd.read_csv(r'books.csv',sep=',',usecols=[1])
print(data.head(2))
# 输出
author
0 刘慈欣
1 鲁迅
import pandas as pd
# 指定字段名
city = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida']], columns=['City', 'State'])
city.to_csv('city.csv') # 第一列为序号列
# 字典形式存储
city = pd.DataFrame([{'City':'Sacramento', 'State':'California'}, {'City':'Miami', 'State':'Florida'}])
city.to_csv('city2.csv')
loadtxt
方法默认情况下,读取的数据是float类型,使用str参数,让方法读取数据时,支持str类型。
import numpy as np
with open('books.csv',encoding = 'utf-8') as f:
data = np.loadtxt(f,str,delimiter = ",")
print(data)
import numpy as np
with open('books.csv',encoding = 'utf-8') as f:
data = np.loadtxt(f,str,delimiter = ",", skiprows = 1)
print(data[:2])
# 输出
[['三体' '刘慈欣']
['呐喊' '鲁迅']]
tofile()
函数允许我们将数组写入文本或二进制文件,但会将所有内容存储在一行中import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
np.savetxt('sample.csv', a, delimiter=",")
a.tofile('sample1.csv',sep=',')