Python学习:csv模块: 读取 / 写入 csv数据 您所在的位置:网站首页 python标准库导入的方法有哪些 Python学习:csv模块: 读取 / 写入 csv数据

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

2024-01-06 14:58| 来源: 网络整理| 查看: 265

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()返回了一个文件对象myFile,reader(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'})

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

delimiter和 lineterminator 关键字参数

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

>>> 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()的 delimiter 和 lineterminator关键字参数,将这些字符改成不同的值。 在这里插入图片描述

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()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有