Python学习:csv模块: 读取 / 写入 csv数据

csv模块包含在Python标准库中,可用于分析CSV文件中的数据行,让我们能够快速提取感兴趣的值。

csv模块 中的方法 只能够读取 / 写入到一个sheet

csv模块中的函数

1、csv.reader(csvfile, dialect='excel', **fmtparams)

参数:
csvfile,必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象,如果是文件对象,打开时需要加"b"标志参数。
dialect,编码风格,默认为excel的风格,也就是用逗号(,)分隔,dialect方式也支持自定义,通过调用register_dialect方法来注册,。
fmtparam,格式化参数,用来覆盖之前dialect对象指定的编码风格。


import csv
with open('test.csv','rb') as myFile:
    lines=csv.reader(myFile)
    for line in lines:
        print line

open()返回了一个文件对象myFilereader(myFile)只传入了第一个参数,另外两个参数采用缺省值,即以excel风格读入。reader()返回一个reader对象lines,lines是一个list,当调用它的方法lines.next()时,会返回一个string。

补充:reader对象还提供一些方法:line_num、dialect、next()

2、csv.writer(csvfile, dialect='excel', **fmtparams)


with open('t.csv','wb') as myFile:    
    myWriter=csv.writer(myFile)
    myWriter.writerow([7,'g'])
    myWriter.writerow([8,'h'])
    myList=[[1,2,3],[4,5,6]]
    myWriter.writerows(myList)

csv.writer(myFile)返回writer对象myWriter。

writerow()方法是一行一行写入,writerows方法是一次写入多行。

补充:除了writerow、writerows,writer对象还提供了其他一些方法:writeheader、dialect

2)追加

除了直接写入,还能实现追加:还是刚才那个例子,我现在将一行新的数据添加到旧的数据后面,最后写入CSV

import csv

# 新增的数据行,以列表的形式表示
add_info = ["Guo", 150]

# 以添加的形式写入csv,跟处理txt文件一样,设定关键字"a",表追加
csvFile = open("instance.csv", "a")

# 新建对象writer
writer = csv.writer(csvFile)

# 写入,参数还是列表形式
writer.writerow(add_info)

csvFile.close()
3、csv.DictReader(csvfile, fieldnames=None)
class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

创建一个对象,其操作类似于普通读取器,但将读取的信息映射到一个dict中,其中的键由可选的fieldnames参数给出。fieldnames参数是一个sequence,其元素按顺序与输入数据的字段相关联。这些元素成为结果字典的键。如果省略fieldnames参数,则csvfile的第一行中的值将用作字段名称,如果读取的行具有比字段名序列更多的字段,则剩余数据将作为键值为restkey的序列添加。如果读取的行具有比字段名序列少的字段,则剩余的键使用可选的restval参数的值。任何其他可选或关键字参数都传递给底层的reader实例。
DictReader,和reader函数类似,接收一个可迭代的对象,能返回一个生成器,但是返回的每一个单元格都放在一个字典的值内,而这个字典的键则是这个单元格的标题(即列头)
在这里插入图片描述

with open('names.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['first_name'], row['last_name'])
#输出
Baked Beans
Lovely Spam
Wonderful Spam
import csv

#读
with open("test.csv", "r", encoding = "utf-8") as f:
    reader = csv.DictReader(f)
    column = [row for row in reader]

print(column)
输出:
[{'No.': '1', 'Age': '18', 'Score': '99', 'Name': 'mayi'},
 {'No.': '2', 'Age': '21', 'Score': '89', 'Name': 'jack'},
 {'No.': '3', 'Age': '25', 'Score': '95', 'Name': 'tom'},
 {'No.': '4', 'Age': '19', 'Score': '80', 'Name': 'rain'}]

如果我们想用DictReader读取csv的某一列,就可以用列的标题查询:

import csv

#读取Name列的内容
with open("test.csv", "r", encoding = "utf-8") as f:
    reader = csv.DictReader(f)
    column = [row['Name'] for row in reader]
print(column)
输出:
['mayi', 'jack', 'tom', 'rain']
4、csv.DictWriter(csvfile, fieldnames, restval='',*args, **kwds)
class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

创建一个操作类似于常规writer的对象,但将字典映射到输出行。fieldnames参数是一个sequence,用于标识传递给writerow()方法的字典中的值被写入csvfile。如果字典在fieldnames中缺少键,则可选的restval参数指定要写入的值。如果传递给writerow()方法的字典包含fieldnames中未找到的键,则可选的extrasaction参数指示要执行的操作。如果设置为’raise’,则会引发ValueError。如果设置为’ignore’,则会忽略字典中的额外值。任何其他可选或关键字参数都传递给底层的writer实例。

请注意,与DictReader类不同,DictWriter的fieldnames参数不是可选的。由于Python的dict对象没有排序,因此没有足够的信息来推断将该行写入到csvfile的顺序。

import csv

with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

结果:
在这里插入图片描述

delimiterlineterminator 关键字参数

假定你希望用制表符代替逗号来分隔单元格,并希望有两倍行距。

>>> import csv
>>> csvFile = open('example.tsv', 'w', newline='')
>>> csvWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
>>> csvWriter.writerow(['apples', 'oranges', 'grapes'])
24
>>> csvWriter.writerow(['eggs', 'bacon', 'ham'])
17
>>> csvWriter.writerow(['spam', 'spam', 'spam', 'spam', 'spam', 'spam'])
32
>>> csvFile.close(

默认情况下, CSV 文件的分隔符是逗号。行终止字符是出现在行末的字符。默认情况下,行终止字符是换行符。你可以利用 csv.writer()delimiterlineterminator关键字参数,将这些字符改成不同的值。
在这里插入图片描述

Reader Objects
  • csvreader.__next__()
    返回读者的可迭代对象的下一行作为列表,根据当前方言解析。通常你应该把它叫做next(reader)

  • csvreader.line_num
    从源迭代器读取的行数。这与返回的记录数不同,因为记录可以跨越多行。

Writer Objects
  • csvwriter.writerow(row)
    将行参数写入写入程序的文件对象,根据当前方言格式化。

  • csvwriter.writerows(rows)
    将所有行参数(如上所述的行对象的列表)写入作者的文件对象,根据当前方言格式化。

Writer对象具有以下公共属性:

  • csvwriter.dialect
    作者使用的方言的只读描述。

  • DictWriter对象具有以下公共方法:

  • DictWriter.writeheader()
    用字段名写入一行(在构造函数中指定)。

分析 CSV 文件头

import csv
filename = 'sitka_weather_07-2014.csv':
	with open(filename) as f:
		reader = csv.reader(f)
		header_row = next(reader)
		print(header_row)

导入模块csv后,我们将要使用的文件的名称存储在filename中。接下来,我们打开这个文件,并将结果文件对象存储在f中。然后,我们调用csv.reader(),并将前面存储的文件对象作为实参传递给它,从而创建一个与该文件相关联的阅读器( reader)对象。我们将这个阅读器对象存储在reader中。
模块csv包含函数next(),调用它并将阅读器对象传递给它时,它将返回文件中的下一行。在前面的代码中,我们只调用了next()一次,因此得到的是文件的第一行,其中包含文件头。reader处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。

打印文件头及其位置

为让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:

with open(filename) as f:
	reader = csv.reader(f)
	header_row = next(reader)
	for index, column_header in enumerate(header_row):
		print(index, column_header)

对列表调用了enumerate()来获取每个元素的索引及其值。

提取并读取数据

知道需要哪些列中的数据后,我们来读取一些数据。

filename= 'sitka_weather_07-2014.csv'
with open(filename) as f:
    readr=csv.reader(f)
    header_row=next(readr)

    highs=[]

    for row in readr:
        highs.append(row[1])
    print(highs)

创建了一个名为highs的空列表,再遍历文件中余下的各行。阅读器对象从其停留的地方继续往下读取CSV文件,每次都自动返回当前所处位置的下一行。由于我们已经读取了文件头行,这个循环将从第二行开始——从这行开始包含的是实际数据。每次执行该循环时,我们都将索引1处(第2列)的数据附加到highs末尾,

案例:从 CSV 文件中删除表头

#! python3
# removeCsvHeader.py - Removes the header from all CSV files in the current
# working directory.
import csv, os

os.makedirs('headerRemoved', exist_ok=True)
# Loop through every file in the current working directory.
for csvFilename in os.listdir('.'):
	if not csvFilename.endswith('.csv'):
		continue # skip non-csv files
	print('Removing header from ' + csvFilename + '...')

	# Read the CSV file in (skipping first row).
	csvRows = []
	csvFileObj = open(csvFilename)
	readerObj = csv.reader(csvFileObj)
	for row in readerObj:
		if readerObj.line_num == 1:   #利用 line_num 属性确定要跳过哪一行
			continue # skip first row
		csvRows.append(row)
	csvFileObj.close()

	# Write out the CSV file.
	csvFileObj = open(os.path.join('headerRemoved', csvFilename), 'w',	newline='')
	csvWriter = csv.writer(csvFileObj)
	for row in csvRows:
		csvWriter.writerow(row)
	csvFileObj.close()
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值