处理csv文件

处理csv文件

csv模块

csv文件中的每行代表电子表格中的一行,逗号分割了该行中的单元格。

csv文件是简单的,缺少Excel表格的许多功能。比如:

  • 值没有类型,所有东西都是字符串;
  • 没有字体大小和颜色的设置
  • 没有多个单元格
  • 不能指定单元格的宽度和长度
  • 不能合并单元格
  • 不能嵌入图像或图表

reader对象

要用csv文件对csv文件进行数据读取,需要创建一个Reader对象。Reader对象让你迭代遍历csv文件中的每一行。

下面是这次使用的csv文件实例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oImPJCLo-1611202379489)(C:\Users\26217\Desktop\csv文件.png)]

将csv文件放在当前目录下之后,代码如下:

import csv
example_file = open('example.csv')
example_Reader = csv.reader(example_file)
example_data = list(example_Reader)
print(example_data)

运行结果如下:

[['4/5/2014 13:34', 'Apples', '73'], ['4/5/2014 3:41', 'Cherries', '85'], ['4/6/2014 12:46', 'Pears', '14'], ['4/8/2014 8:59', 'Oranges', '52'], ['4/10/2014 2:07', 'Apples', '152'], ['4/10/2014 18:10', 'Bananas', '23'], ['4/10/2014 2:40', 'Strawberries', '98']]

csv模块时python自带的,所以我们不需要安装就能使用导入它。

要用csv模块读取csv文件,首先要用open()函数打开它,就行打开任何其他文本文件一样。但是,不用在open()返回的file对象上调用read()或readline()方法,而是将它直接传递给csv.reader()函数。然后就会返回一个Reader对象,供你使用。请注意,不要直接将文件名字符串传递给csv.reader()函数。

其次,要访问csv文件中的值最直接的办法就是将它转换成一个python列表。在这个Reader对象上应用list()函数,将返回一个列表的列表。

csv文件已经表示为列表的列表,就可以用列表的访问方式来访问特定的行和特定的列的值。

结果如下:

print(example_data[0][0])
print(example_data[0][1])
print(example_data[0][2])
print(example_data[1][1])
print(example_data[6][1])

输出结果如下:

4/5/2014 13:34
Apples
73
Cherries
Strawberries

在for循环中,从Reader对象读取数据

在大型的csv文件中,你肯定需要一个for循环中使用Reader对象。这样避免将整个文件一次性装入内存。代码如下:

import csv
example_file = open('example.csv')
example_Reader = csv.reader(example_file)

for data in example_Reader:
    print('Row # ' + str(example_Reader.line_num) + ' ' + str(data))

结果如下:

Row # 1 ['4/5/2014 13:34', 'Apples', '73']
Row # 2 ['4/5/2014 3:41', 'Cherries', '85']
Row # 3 ['4/6/2014 12:46', 'Pears', '14']
Row # 4 ['4/8/2014 8:59', 'Oranges', '52']
Row # 5 ['4/10/2014 2:07', 'Apples', '152']
Row # 6 ['4/10/2014 18:10', 'Bananas', '23']
Row # 7 ['4/10/2014 2:40', 'Strawberries', '98']

导入csv模块后,然后从csv文件中得到Reader对象之后,可以遍历循环Reader对象中的行。每一行就是一个值的列表,每个值就是一个单元格。

Reader对象只能循环遍历一次,要再次读取csv文件,必须调用csv.reader,创建一个对象。

Writer对象

Writer对象让你将数据写入csv文件。要创建一个Writer对象,就要使用csv.writer()函数。

代码如下:

import csv
output_file = open('output.csv', 'w', newline='')
output_writer = csv.writer(output_file)
output_writer.writerow(['spam', 'eggs', 'bacon', 'ham'])
output_writer.writerow(['Hello world', 'eggs', 'bacon', 'ham'])
output_writer.writerow([1, 2, 3, 3.1415926, 4])
output_file.close()

执行接受后,生成一个output.csv文件,内容如下:

spam,eggs,bacon,ham
Hello world,eggs,bacon,ham
1,2,3,3.1415926,4

首先调用了open()函数,传入’w’模式,以写模式打开一个文件。这就创建了对象,然后将它传递个csv.writer(),创建一个Writer对象。

delimiter和lineterminator关键字参数

假如你希望用制表符来代替逗号分割单元格,而且还要两本行距。

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

结果如下:

apples  oranges    grapes

spam   spam   spam   spam   spam   spam

eggs   bacon  ham

传入delimiter=’\t’, lineterminator=’\n\n’,这将单元格之间的字符改变为制表符,将行之间的字符改变成了两个换行符,调用了三次writerow()函数,所以得到三行的csv文件。

删除csv文件中的表头

现在要删除几百行csv文件中的第一行,这很枯燥也很耗时,现在我们打开这个csv文件,读取csv文件的内容,并删除第一行的内容重新写入同名文件。这就用新的、没有表头的内容替换了csv文件的旧内容

温馨提示:当你用程序修改文件时,一定要备份文件,以防万一你的程序没有按希望的那样执行,那么你的文件将一去不复回

这个程序需要做到以下几点:

  • 找到当前目录下面的csv文件
  • 读取这个文件的全部内容
  • 跳过第一行,将内容写入一个新的csv文件

代码执行:

  • 循环遍历,找到csv文件
  • 创建一个csvReader对象,读取该文件的内容,利用line_num属性确定要跳过的哪一行
  • 创建一个csvWriter对象,将读写的数据写入新文件

1.循环遍历每个csv文件

import csv
import os


os.makedirs('headerRemoved', exist_ok=True)
for csvFilename in os.listdir('.'):
    if not csvFilename.endswith('.csv'):
        continue # 跳过那些非csv文件

    print('Removing header from ' + csvFilename + '...')


os.makedirs()调用将创建一个文件夹名为headerRemoved,将所有无表头的文件全部写入该文件夹。

2.读入csv文件

该程序不会删除原文件的第一行,但是,它会创建新的csv文件副本,不包含第一行,因为副本的文件名与原文件一样,所以副本会覆盖原来的文件。

这个程序需要一种方法来知道它正在循环当前是否在处理第一行。因此添加以下代码:

import csv
import os


os.makedirs('headerRemoved', exist_ok=True)
for csvFilename in os.listdir('.'):
    if not csvFilename.endswith('.csv'):
        continue # 跳过那些非csv文件

    print('Removing header from ' + csvFilename + '...')

    csvRows = []
    csvFileObj = open(csvFilename)
    readerObj = csv.reader(csvFileObj)
    for row in readerObj:
        if readerObj.line_num == 1:
            continue
        csvRows.append(row)
    csvFileObj.close()

Reader对象的line_num的属性可以用来确定当前读入的是csv文件的哪一行。

另一个for循环会循环遍历csvReader对象返回的所有行,除了第一行,所有行都会添加到csvRows。

在for循环每一行时,代码检查reader.line_num是否设置为1.如果是它执行continue,转向下一行,不将它添加到csvRows中。之后的每一行条件都是False,添加到csvRows中。

3.写入csv文件,不包含第一行

现在csvRows包含了除了第一行的所有行,将这些列表写入headerRomoved文件夹中的csv文件。代码如下:

import csv
import os


os.makedirs('headerRemoved', exist_ok=True)
for csvFilename in os.listdir('.'):
    if not csvFilename.endswith('.csv'):
        continue  # 跳过那些非csv文件

    print('Removing header from ' + csvFilename + '...')

    csvRows = []
    csvFileObj = open(csvFilename)
    readerObj = csv.reader(csvFileObj)
    for row in readerObj:
        if readerObj.line_num == 1:
            continue
        csvRows.append(row)

    csvFileObj = open(os.path.join('headerRemoved', csvFilename), 'w', newline='')
    csvWriter = csv.writer(csvFileObj)
    for row in csvRows:
        csvWriter.writerow(row)
    csvFileObj.close()

CSV Writer对象利用csvFilename,将列表写入一个headerRomved中的一个csv文件。这就覆盖了原来的文件

创建Writer对象后,我们将循环遍历存储在csvRows中的子列表,将每个子列表写入该文件。

执行代码之前的原csv文件

apples  oranges    grapes

spam   spam   spam   spam   spam   spam

eggs   bacon  ham
spam,eggs,bacon,ham
Hello world,eggs,bacon,ham
1,2,3,3.1415926,4

执行代码之后的csv文件

spam   spam   spam   spam   spam   spam

eggs   bacon  ham
Hello world,eggs,bacon,ham
1,2,3,3.1415926,4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值