【Python】Python处理csv文件
Python 处理 csv 文件
CSV(Comma-Separated Values) 即逗号分隔值,可以用 Excel 打开查看。由于是纯文本,任何编辑器也都可打开。与 Excel 文件不同,CSV 文件中:
- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格的宽高,不能合并单元格
- 没有多个工作表
- 不能嵌入图像图表
在 CSV 文件中,以,
作为分隔符,分隔两个单元格。像这样a,,c
表示单元格a
和单元格c
之间有个空白的单元格。依此类推。
不是每个逗号都表示单元格之间的分界。所以即使 CSV 是纯文本文件,也坚持使用专门的模块进行处理。Python 内置了 csv 模块。先看看一个简单的例子。
从 CSV 文件中读取数据
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
print(list(reader))
data
不能直接打印,list(data) 最外层是 list,里层的每一行数据都在一个 list 中,有点像这样
[['name', 'age'], ['Bob', '14'], ['Tom', '23'], ...]
于是我们可以这样访问到 Bob 的年龄reader[1][1]
, 在 for 循环中遍历如下
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
for row in reader:
# 行号从 1 开始
print(reader.line_num, row)
截取一部分输出
1 ['AKST', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', 'Mean Humidity', 'Min Humidity', 'Max Sea Level PressureIn', 'Mean Sea Level PressureIn', 'Min Sea Level PressureIn', 'Max VisibilityMiles', 'Mean VisibilityMiles', 'Min VisibilityMiles', 'Max Wind SpeedMPH', 'Mean Wind SpeedMPH', 'Max Gust SpeedMPH', 'PrecipitationIn', 'CloudCover', 'Events', 'WindDirDegrees']
2 ['2014-1-1', '46', '42', '37', '40', '38', '36', '97', '86', '76', '29.95', '29.77', '29.57', '10', '8', '2', '25', '14', '36', '0.69', '8', 'Rain', '138']
...
前面的数字是行号,从 1 开始,可以用reader.line_num
获取。
要注意的是,reader 只能被遍历一次。由于 reader 是可迭代对象,可以使用next
方法一次获取一行。
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
# 读取一行,下面的 reader 中已经没有该行了
head_row = next(reader)
for row in reader:
# 行号从 2 开始
print(reader.line_num, row)
写数据到 csv 文件中
有 reader 可以读取,当然也有 writer 可以写入。一次写入一行,一次写入多行都可以。
import csv
# 使用数字和字符串的数字都可以
datas = [['name', 'age'],
['Bob', 14],
['Tom', 23],
['Jerry', '18']]
with open('example.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in datas:
writer.writerow(row)
<span class="hljs-comment"># 还可以写入多行</span>
writer.writerows(datas)</code></pre>
如果不指定newline=''
, 则每写入一行将有一空行被写入。上面的代码生成如下内容。
name,age
Bob,14
Tom,23
Jerry,18
name,age
Bob,14
Tom,23
Jerry,18
DictReader 和 DictWriter 对象
使用 DictReader 可以像操作字典那样获取数据,把表的第一行(一般是标头)作为 key。可访问每一行中那个某个 key 对应的数据。
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.DictReader(f)
for row in reader:
# Max TemperatureF 是表第一行的某个数据,作为 key
max_temp = row['Max TemperatureF']
print(max_temp)
使用 DictWriter 类,可以写入字典形式的数据,同样键也是标头(表格第一行)。
import csv
headers = ['name', 'age']
datas = [{'name':'Bob', 'age':23},
{'name':'Jerry', 'age':44},
{'name':'Tom', 'age':15}
]
with open('example.csv', 'w', newline='') as f:
# 标头在这里传入,作为第一行数据
writer = csv.DictWriter(f, headers)
writer.writeheader()
for row in datas:
writer.writerow(row)
<span class="hljs-comment"># 还可以写入多行</span>
writer.writerows(datas)</code></pre>
就先了解到这儿。