📜  在Python处理 csv 文件

📅  最后修改于: 2021-10-22 03:01:17             🧑  作者: Mango

本文介绍了如何在Python加载和解析 CSV 文件。

首先,什么是 CSV ?
CSV (逗号分隔值)是一种简单的文件格式,用于存储表格数据,例如电子表格或数据库。 CSV 文件以纯文本形式存储表格数据(数字和文本)。文件的每一行都是一条数据记录。每条记录由一个或多个字段组成,以逗号分隔。使用逗号作为字段分隔符是此文件格式名称的来源。

对于在Python处理 CSV 文件,有一个名为csv的内置模块。

读取 CSV 文件

# importing csv module
import csv
  
# csv file name
filename = "aapl.csv"
  
# initializing the titles and rows list
fields = []
rows = []
  
# reading csv file
with open(filename, 'r') as csvfile:
    # creating a csv reader object
    csvreader = csv.reader(csvfile)
      
    # extracting field names through first row
    fields = next(csvreader)
  
    # extracting each data row one by one
    for row in csvreader:
        rows.append(row)
  
    # get total number of rows
    print("Total no. of rows: %d"%(csvreader.line_num))
  
# printing the field names
print('Field names are:' + ', '.join(field for field in fields))
  
#  printing first 5 rows
print('\nFirst 5 rows are:\n')
for row in rows[:5]:
    # parsing each column of a row
    for col in row:
        print("%10s"%col),
    print('\n')

上述程序的输出如下所示:

上面的例子使用了一个 CSV 文件 aapl.csv,可以从这里下载。
使用同一目录中的 aapl.csv 文件运行此程序。

让我们试着理解这段代码。

  • with open(filename, 'r') as csvfile:
        csvreader = csv.reader(csvfile)

    在这里,我们首先以 READ 模式打开 CSV 文件。文件对象被命名为csvfile 。文件对象被转换为 csv.reader 对象。我们将 csv.reader 对象保存为csvreader

  • fields = csvreader.next()

    csvreader是一个可迭代对象。因此, .next() 方法返回当前行并将迭代器推进到下一行。由于我们的 csv 文件的第一行包含标题(或字段名称),我们将它们保存在一个名为fields的列表中。

  • for row in csvreader:
            rows.append(row)

    现在,我们使用 for 循环遍历剩余的行。每行都附加到一个名为rows的列表中。如果您尝试打印每一行,您会发现该行只不过是一个包含所有字段值的列表。

  • print("Total no. of rows: %d"%(csvreader.line_num))

    csvreader.line_num 只不过是一个计数器,它返回已迭代的行数。

写入 CSV 文件

# importing the csv module
import csv
  
# field names
fields = ['Name', 'Branch', 'Year', 'CGPA']
  
# data rows of csv file
rows = [ ['Nikhil', 'COE', '2', '9.0'],
         ['Sanchit', 'COE', '2', '9.1'],
         ['Aditya', 'IT', '2', '9.3'],
         ['Sagar', 'SE', '1', '9.5'],
         ['Prateek', 'MCE', '3', '7.8'],
         ['Sahil', 'EP', '2', '9.1']]
  
# name of csv file
filename = "university_records.csv"
  
# writing to csv file
with open(filename, 'w') as csvfile:
    # creating a csv writer object
    csvwriter = csv.writer(csvfile)
      
    # writing the fields
    csvwriter.writerow(fields)
      
    # writing the data rows
    csvwriter.writerows(rows)

让我们试着分片理解上面的代码。

  • 字段已经定义。 fields 是一个包含所有字段名称的列表。 rows是一个列表列表。每行都是一个包含该行字段值的列表。
  • with open(filename, 'w') as csvfile:
        csvwriter = csv.writer(csvfile)

    在这里,我们首先以 WRITE 模式打开 CSV 文件。文件对象被命名为csvfile 。文件对象被转换为 csv.writer 对象。我们将 csv.writer 对象保存为csvwriter

  • csvwriter.writerow(fields)

    现在我们使用writerow方法来写第一行,它只是字段名称。

  • csvwriter.writerows(rows)

    我们使用writerows方法一次写入多行。

将字典写入 CSV 文件

# importing the csv module
import csv
  
# my data rows as dictionary objects
mydict =[{'branch': 'COE', 'cgpa': '9.0', 'name': 'Nikhil', 'year': '2'},
         {'branch': 'COE', 'cgpa': '9.1', 'name': 'Sanchit', 'year': '2'},
         {'branch': 'IT', 'cgpa': '9.3', 'name': 'Aditya', 'year': '2'},
         {'branch': 'SE', 'cgpa': '9.5', 'name': 'Sagar', 'year': '1'},
         {'branch': 'MCE', 'cgpa': '7.8', 'name': 'Prateek', 'year': '3'},
         {'branch': 'EP', 'cgpa': '9.1', 'name': 'Sahil', 'year': '2'}]
  
# field names
fields = ['name', 'branch', 'year', 'cgpa']
  
# name of csv file
filename = "university_records.csv"
  
# writing to csv file
with open(filename, 'w') as csvfile:
    # creating a csv dict writer object
    writer = csv.DictWriter(csvfile, fieldnames = fields)
      
    # writing headers (field names)
    writer.writeheader()
      
    # writing data rows
    writer.writerows(mydict)

在此示例中,我们将字典mydict写入 CSV 文件。

  • with open(filename, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames = fields)

    在这里,文件对象 ( csvfile ) 被转换为 DictWriter 对象。
    在这里,我们将字段名指定为参数。

  • writer.writeheader()

    writeheader 方法只是使用预先指定的字段名写入 csv 文件的第一行。

  • writer.writerows(mydict)

    writerows方法只是写入所有行,但在每一行中,它只写入值(而不是键)。

所以,最后,我们的 CSV 文件看起来像这样:

要点:

  • 在 csv 模块中,可以给出一个可选的方言参数,用于定义特定于特定CSV 格式的一组参数。默认情况下,csv 模块使用excel方言,这使得它们与 excel 电子表格兼容。您可以使用register_dialect方法定义自己的方言。
    下面是一个例子:
csv.register_dialect(
    'mydialect',
    delimiter = ',',
    quotechar = '"',
    doublequote = True,
    skipinitialspace = True,
    lineterminator = '\r\n',
    quoting = csv.QUOTE_MINIMAL)

现在,在定义 csv.reader 或 csv.writer 对象时,我们可以指定像这样的方言
这:

csvreader = csv.reader(csvfile, dialect='mydialect')
  • 现在,考虑一个纯文本的 CSV 文件如下所示:

    我们注意到分隔符不是逗号而是分号。此外,行由两个换行符而不是一个换行符分隔。在这种情况下,我们可以指定分隔符和行终止符如下:

    csvreader = csv.reader(csvfile, delimiter = ';', lineterminator = '\n\n')

因此,这是关于如何在Python程序中加载和解析 CSV 文件的简短而简洁的讨论。本博客由Nikhil Kumar 提供。如果您喜欢 GeeksforGeeks 并愿意做出贡献,您也可以使用 write.geeksforgeeks.org 撰写文章或将您的文章邮寄至 review-team@geeksforgeeks.org。在 GeeksforGeeks 主页上查看您的文章并帮助其他 Geeks。