使用 Python 处理 CSV:综合教程

2023-10-25

CSV(逗号分隔值)文件是存储和共享表格数据的最常见方法之一。这些文件由行和列组成,其中每行代表一个记录,列包含由分隔符(通常是逗号)分隔的值。

Python 提供了多种内置方法来处理 CSV 文件,使您可以高效地读取、写入和操作数据。

本教程将为您提供有关使用 Python 处理 CSV 文件的深入知识。

 

目录 hide

 

使用 open() 方法读取 CSV

您可以使用open()方法并以文本模式打开文件,然后迭代每一行,使用逗号作为分隔符分割值。
这是一个使用此的简单示例样本文件:


with open('sample.csv', 'r') as file:
    for line in file:
        row = line.strip().split(',')
        print(row)
  

Output:


['"Index"', '"Name"', '"Age"', '"Favorite Color"']
['1', 'John', '6', 'Yellow']
['2', 'Ronald', '17', 'Red']
['3', 'Ruby', '23', 'Blue']
['4', 'Sarah', '53', 'Green']
['5', 'Timothy', '12', 'Green']
['6', 'Carol', '25', 'Red']
['7', 'Leo', '67', 'Blue']
['8', 'Quinn', '22', 'Green']
['9', 'Susan', '64', 'Orange']
['10', 'Luis', '79', 'Red']
  

在这里,open()函数以读取模式(‘r’)打开文件‘sample.csv’,并且strip()方法从每行中删除任何前导或尾随空格。

The split(',')然后,方法用逗号分隔每一行,为每一行提供一个值列表。

读取特定行

您可以通过迭代 CSV 文件并选择所需的行索引来读取特定行。让我们读取第三行(索引 2)sample.csv file.


import csv
def read_specific_row(row_number):
    with open('sample.csv', 'r') as file:
        reader = csv.reader(file)
        for index, row in enumerate(reader):
            if index == row_number:
                print(row)
                break

# Read the third row (index 2)
read_specific_row(2)
  

Output:


['2', 'Ronald', '17', 'Red']  

阅读特定专栏

读取特定列涉及从每一行选择相同的索引。让我们从以下位置读取“名称”列(索引 1):sample.csv file.


def read_specific_column(column_number):
    with open('sample.csv', 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            print(row[column_number])

# Read the "Name" column (index 1)
read_specific_column(1)
  

Output:


'Name'
'John'
'Ronald'
'Ruby'
'Sarah'
'Timothy'
'Carol'
'Leo'
'Quinn'
'Susan'
'Luis'  

 

使用 Python csv.reader 读取 CSV

为了更结构化的 CSV 读取,Python 提供了专用的csv模块.

使用csv.reader函数为您提供了更多控制权并使代码更具可读性。
这是一个例子:


import csv
with open('sample.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)
  

Output:


['"Index"', '"Name"', '"Age"', '"Favorite Color"']
['1', 'John', '6', 'Yellow']
['2', 'Ronald', '17', 'Red']
['3', 'Ruby', '23', 'Blue']
['4', 'Sarah', '53', 'Green']
['5', 'Timothy', '12', 'Green']
['6', 'Carol', '25', 'Red']
['7', 'Leo', '67', 'Blue']
['8', 'Quinn', '22', 'Green']
['9', 'Susan', '64', 'Orange']
['10', 'Luis', '79', 'Red']
  

在这里,您导入csv模块并使用csv.reader()方法,传入打开的文件。

这将返回一个迭代器,允许您循环遍历行,就像使用open() method.

The csv.reader负责用逗号分隔行。

获取行数

您可以遍历行,并在行进行时对它们进行计数:


import csv
def get_number_of_rows(filename):
    with open(filename, 'r') as file:
        reader = csv.reader(file)
        return sum(1 for row in reader)

rows_count = get_number_of_rows('sample.csv')
print("Number of rows (including the header):", rows_count)
  

Output:


Number of rows (including the header): 11  

结果为您提供 CSV 文件中的行数,并且在计数中包括标题行。

 

处理不同的分隔符

如果您的 CSV 文件由逗号以外的任何分隔符分隔,您可以使用delimiter范围。
以下是从此示例中读取以分号作为分隔符的文件的示例file:


import csv
with open('sample_semicolon.csv', 'r') as file:
    reader = csv.reader(file, delimiter=';')
    for row in reader:
        print(row)
  

Output:


['"Index"', '"Name"', '"Age"', '"Favorite Color"']
['1', 'John', '6', 'Yellow']
['2', 'Ronald', '17', 'Red']
['3', 'Ruby', '23', 'Blue']
['4', 'Sarah', '53', 'Green']
['5', 'Timothy', '12', 'Green']
['6', 'Carol', '25', 'Red']
['7', 'Leo', '67', 'Blue']
['8', 'Quinn', '22', 'Green']
['9', 'Susan', '64', 'Orange']
['10', 'Luis', '79', 'Red']  

通过提供delimiter参数,您可以定义自定义字符来分隔值。

在本例中,分号“;”是分隔符,因此csv.reader使用它将每一行分成几列。

 

使用 csv.DictReader 将 CSV 文件读入词典

With csv.DictReader,CSV 文件中的每一行都作为 OrderedDict 返回,其中键是第一行中的字段名称。
操作方法如下:


import csv
with open('sample.csv', 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row)
  

Output:


{'Index': '1', 'Name': 'John', 'Age': '6', 'Favorite Color': 'Yellow'}
{'Index': '2', 'Name': 'Ronald', 'Age': '17', 'Favorite Color': 'Red'}
{'Index': '3', 'Name': 'Ruby', 'Age': '23', 'Favorite Color': 'Blue'}
{'Index': '4', 'Name': 'Sarah', 'Age': '53', 'Favorite Color': 'Green'}
{'Index': '5', 'Name': 'Timothy', 'Age': '12', 'Favorite Color': 'Green'}
{'Index': '6', 'Name': 'Carol', 'Age': '25', 'Favorite Color': 'Red'}
{'Index': '7', 'Name': 'Leo', 'Age': '67', 'Favorite Color': 'Blue'}
{'Index': '8', 'Name': 'Quinn', 'Age': '22', 'Favorite Color': 'Green'}
{'Index': '9', 'Name': 'Susan', 'Age': '64', 'Favorite Color': 'Orange'}
{'Index': '10', 'Name': 'Luis', 'Age': '79', 'Favorite Color': 'Red'}
  

Here, csv.DictReader读取 CSV 文件的第一行并将其用作字典的键。后续行将使用这些键读入字典,从而可以轻松按名称引用各个字段。

 

使用 open() 方法写入 CSV 文件

您可以使用open()具有写入模式(‘w’)的方法并使用write() method.
这是一个简单的例子:


data = [['Name', 'Age', 'Occupation'], ['John', '32', 'Engineer'], ['Jane', '28', 'Doctor']]
with open('output.csv', 'w') as file:
    for row in data:
        file.write(','.join(row) + '\n')
  

Output:
File output.csv将有:


Name,Age,Occupation
John,32,Engineer
Jane,28,Doctor
  

在这里,open()函数与“w”模式一起使用来打开文件进行写入。

在循环内部,','.join(row)将值之间用逗号连接起来,并且write()方法将每一行写入文件。

 

使用 csv.writer 写入 CSV 文件

编写 CSV 文件的一种更结构化的方法是使用csv.writer方法从csv module:


import csv
data = [['Name', 'Age', 'Occupation'], ['John', '32', 'Engineer'], ['Jane', '28', 'Doctor']]
with open('output.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)
  

Output:
File output.csv将有:


Name,Age,Occupation
John,32,Engineer
Jane,28,Doctor
  

在这里,csv.writer()方法提供了一种使用以下方法将行写入文件的简单方法writer.writerows()功能。

The newline=''参数确保在不同平台上正确处理行结尾。

 

使用 csv.DictWriter 编写字典

The csv模块还提供了一种将字典写入 CSV 文件的便捷方法csv.DictWriter。当数据已经是字典格式时,它特别有用。
使用方法如下:


import csv
data = [
    {'Name': 'John', 'Age': '32', 'Occupation': 'Engineer'},
    {'Name': 'Jane', 'Age': '28', 'Occupation': 'Doctor'}
]
with open('output.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=['Name', 'Age', 'Occupation'])
    writer.writeheader()
    writer.writerows(data)
  

Output:
File output.csv将有:


Name,Age,Occupation
John,32,Engineer
Jane,28,Doctor
  

With csv.DictWriter,您提供fieldnames作为确定列顺序的键列表。

The writeheader()方法将键写入标题行,并且writer.writerows(data)将字典作为行写入 CSV 文件中。

 

处理引号字符

当值包含逗号或换行符等特殊字符时,您可以使用引号。指定quotechar and quoting参数。
例子:


import csv
with open('quoted.csv', 'w', newline='') as file:
    writer = csv.writer(file, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(['Name', 'Age', 'Occupation, Title'])
  

Output:
File quoted.csv将有:


Name,Age,"Occupation, Title"
  

通过设置quotechar and quoting,您可以控制特殊字符的处理方式。在上面的示例中,第三个值包含在引号中,因为它包含逗号。

 

操作列

添加列

向 CSV 文件添加新列可以通过读取文件、向每一行添加新列,然后将修改后的行写回新文件来完成。
这是一个例子:


import csv

# Adding a new column 'Salary'
with open('sample.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)

    # Write headers with the new column
    headers = next(reader)
    headers.append('Salary')
    writer.writerow(headers)

    # Write rows with a new column value
    for row in reader:
        row.append('50000')
        writer.writerow(row)
  

Output:
File output.csv将有:


Index,Name,Age,Favorite Color,Salary
1,John,6,Yellow,50000
2,Ronald,17,Red,50000
3,Ruby,23,Blue,50000
4,Sarah,53,Green,50000
5,Timothy,12,Green,50000
6,Carol,25,Red,50000
7,Leo,67,Blue,50000
8,Quinn,22,Green,50000
9,Susan,64,Orange,50000
10,Luis,79,Red,50000
  

删除列

删除列可以通过在写入新文件时省略该列来实现。
例子:


import csv
with open('input.csv', 'r') as infile:
    reader = csv.reader(infile)    
    with open('output.csv', 'w', newline='') as outfile:
        writer = csv.writer(outfile)
        for row in reader:
            # Removing the Age column (index 2)
            del row[2]
            # Writing the modified row to the new file
            writer.writerow(row)
  

Output:
File output.csv将有:


Index,Name,Favorite Color
1,John,Yellow
2,Ronald,Red
3,Ruby,Blue
4,Sarah,Green
5,Timothy,Green
6,Carol,Red
7,Leo,Blue
8,Quinn,Green
9,Susan,Orange
10,Luis,Red
  

在此示例中,在写入新文件之前,将从标题和各个行中删除“年龄”列。

重命名列标题

以下是如何将“最喜欢的颜色”列重命名为“颜色”的示例sample.csv file:


import csv
with open('sample.csv', 'r') as file:
    reader = csv.reader(file)
    rows = list(reader)

# Modify the header
rows[0][3] = 'Color'

# Write the data back to the file
with open('sample.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(rows)
  

Output:


"Index","Name","Age","Color"
1,John,6,Yellow
2,Ronald,17,Red
3,Ruby,23,Blue
4,Sarah,53,Green
5,Timothy,12,Green
6,Carol,25,Red
7,Leo,67,Blue
8,Quinn,22,Green
9,Susan,64,Orange
10,Luis,79,Red
  

 

操纵行

添加行

将行附加到 CSV 文件非常简单。您可以以追加模式(‘a’)打开文件并写入新行。
这是一个例子:


import csv
new_rows = [['11', 'Jake', '40', 'White'], ['12', 'Emily', '35', 'Black']]
with open('sample.csv', 'a', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(new_rows)
  

Output:
File sample.csv将有:


"Index","Name","Age","Favorite Color"
1,John,6,Yellow
2,Ronald,17,Red
3,Ruby,23,Blue
4,Sarah,53,Green
5,Timothy,12,Green
6,Carol,25,Red
7,Leo,67,Blue
8,Quinn,22,Green
9,Susan,64,Orange
10,Luis,79,Red
11,Jake,40,White
12,Emily,35,Black
  

在这里,以追加模式打开文件允许将新行添加到文件末尾,而不会覆盖现有内容。

删除行(过滤)

删除行需要读取文件,过滤掉不需要的行,然后将剩余的行写回文件。
例子:


import csv
with open('sample.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    writer.writerow(next(reader))

    # Write only the rows that have Age greater than 50
    for row in reader:
        if int(row[2]) > 50:
            writer.writerow(row)
  

Output:
File output.csv将有:


Index,Name,Age,Favorite Color
4,Sarah,53,Green
7,Leo,67,Blue
9,Susan,64,Orange
10,Luis,79,Red
  

此处,代码过滤掉“Age”小于 50 的行,并仅将剩余行写入新文件。

替换值

假设您想将年龄“17”替换为“18”。以下是实现这一目标的方法:


import csv
def replace_values(filename, old_value, new_value):
    with open(filename, 'r') as file:
        reader = csv.reader(file)
        rows = [row for row in reader]

    # Replace the old value with the new value
    for row in rows:
        for index, value in enumerate(row):
            if value == old_value:
                row[index] = new_value

    # Write the updated data back to the file
    with open(filename, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerows(rows)
replace_values('sample.csv', '17', '18')
  

Output:


"Index","Name","Age","Favorite Color"
1,John,6,Yellow
2,Ronald,18,Red
3,Ruby,23,Blue
4,Sarah,53,Green
5,Timothy,12,Green
6,Carol,25,Red
7,Leo,67,Blue
8,Quinn,22,Green
9,Susan,64,Orange
10,Luis,79,Red
  

如您所见,第二排的年龄是 17 岁,现在是 18 岁。

 

数据排序

您可以使用基于一列或多列对行进行排序sorted()功能。
下面是按年龄排序的示例:


import csv
with open('sample.csv', 'r') as file:
    reader = csv.reader(file)
    rows = list(reader)

# Sort by Age (index 2)
rows[2:] = sorted(rows[2:], key=lambda row: int(row[2]))
with open('sorted.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(rows)
  

Output:
File sorted.csv将有:


Index,Name,Age,Favorite Color
1,John,6,Yellow
5,Timothy,12,Green
2,Ronald,17,Red
8,Quinn,22,Green
3,Ruby,23,Blue
6,Carol,25,Red
12,Emily,35,Black
11,Jake,40,White
4,Sarah,53,Green
9,Susan,64,Orange
7,Leo,67,Blue
10,Luis,79,Red
  

在此示例中,代码将所有行读取到列表中,然后使用“年龄”列对行(不包括标题)进行排序sorted函数和 lambda 函数作为键。然后将排序后的行写入新的 CSV 文件。

 

合并和连接 CSV 文件

当相关数据分布在多个文件中时,合并和连接 CSV 文件是一项常见任务。

您可以通过读取文件并根据公共键或列匹配行来实现此目的。
以下是在公共“ID”列上连接两个 CSV 文件的示例:
file1.csv:


ID,Name
1,John
2,Jane
  

file2.csv:


ID,Age
1,32
2,28
  

合并这些文件的代码:


import csv
file2_data = {}
with open('file2.csv', 'r') as file:
    reader = csv.reader(file)
    next(reader) # Skip header
    for row in reader:
        file2_data[row[0]] = row[1]

# Read file1.csv and join with file2.csv
with open('file1.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    writer.writerow(next(reader) + ['Age'])

    # Join and write rows
    for row in reader:
        writer.writerow(row + [file2_data[row[0]]])
  

Output:
File output.csv将有:


ID,Name,Age
1,John,32
2,Jane,28
  

在这个例子中,file2.csv首先使用“ID”列作为键读入字典。

Then, file1.csv逐行读取,“年龄”列来自file2.csv使用“ID”作为公共键附加到每一行。

 

处理缺失值

处理数据时,CSV 文件中的缺失值可能会导致错误或结果不准确。

您可以通过跳过缺失值、使用默认值填充缺失值或使用数据插补方法来处理缺失值。
下面是一个用默认值填充缺失值的示例:


import csv
with open('missing_values.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        # Replace missing values (empty strings) with 'N/A'
        cleaned_row = [value if value != '' else 'N/A' for value in row]
        writer.writerow(cleaned_row)
  

missing_values.csv内容:


Name,Age,Occupation
John,,Engineer
Jane,28,
  

Output:
File output.csv将有:


Name,Age,Occupation
John,N/A,Engineer
Jane,28,N/A
  

在此示例中,缺失值由 CSV 文件中的空字符串表示。该代码读取每一行并用“N/A”替换缺失值,然后将清理后的行写入新文件。

 

处理重复行

CSV 文件中的重复行可能会影响您的数据分析。您需要识别并删除重复项以确保工作的准确性。
以下是如何根据所有列删除重复行的示例:


import csv
seen_rows = set()
with open('duplicates.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        row_tuple = tuple(row)
        if row_tuple not in seen_rows:
            writer.writerow(row)
            seen_rows.add(row_tuple)
  

duplicates.csv内容:


Name,Age,Occupation
John,32,Engineer
Jane,28,Doctor
John,32,Engineer
  

Output:
File output.csv将有:


Name,Age,Occupation
John,32,Engineer
Jane,28,Doctor
  

在此示例中,有一个名为seen_rows跟踪已处理的行。如果遇到集合中已有的行,则会跳过该行,从而有效地从输出文件中删除重复项。

 

具有不同编码的 CSV 文件

文件可以使用不同的字符集进行编码,例如 UTF-8 或 ISO-8859-1。

读写不同编码的CSV文件需要在Python中指定编码。
下面是读取以 ISO-8859-1 编码的文件并以 UTF-8 写入的示例:


import csv
with open('input.csv', 'r', encoding='ISO-8859-1') as infile, open('output.csv', 'w', newline='', encoding='UTF-8') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        writer.writerow(row)
  

通过指定encoding中的参数open函数,可以处理不同编码的文件。

在此示例中,代码读取以 ISO-8859-1 编码的文件并使用 UTF-8 写入该文件。
在处理可能无法以标准 ASCII 编码表示的国际字符和符号时,这一点至关重要。

 

读取和写入大文件

当处理无法放入内存的大型 CSV 文件时,您可以逐行读取和写入文件以减少内存使用量。
以下是逐行读取和写入大文件的示例:


with open('large_input.csv', 'r') as infile, open('large_output.csv', 'w', newline='') as outfile:
    for line in infile:
        outfile.write(line)
  

此代码一次一行读取大型 CSV 文件,并将每一行写入一个新文件。通过避免将整个文件加载到内存中,它使您能够处理超出可用内存的文件。
虽然此方法内存效率高,但它可能并不适合所有数据处理任务,尤其是那些需要随机访问文件内容的任务。然而,对于简单的转换或过滤,它可能非常有用。

 

第三方库概述

虽然 Python 的内置 CSV 模块功能强大,但第三方库可以提供额外的功能和优化。

agate

Agate 是一个数据分析库,它扩展了 Python 内置 CSV 处理的功能。


import agate
table = agate.Table.from_csv('data.csv')
table.print_table()
  

Output:


| Index | Name    | Age | Favorite Color |
| ----- | ------- | --- | -------------- |
|     1 | John    |   6 | Yellow         |
|     2 | Ronald  |  17 | Red            |
|     3 | Ruby    |  23 | Blue           |
|     4 | Sarah   |  53 | Green          |
|     5 | Timothy |  12 | Green          |
|     6 | Carol   |  25 | Red            |
|     7 | Leo     |  67 | Blue           |
|     8 | Quinn   |  22 | Green          |
|     9 | Susan   |  64 | Orange         |
|    10 | Luis    |  79 | Red            |
  

Agate 提供 SQL 式查询、统计等功能。它对于复杂的数据分析任务特别有用。

 

基准阅读

使用 CSV 文件时,性能可能会因读取数据所用的方法而异。

我们来比较一下性能open(), csv.reader, csv.DictReader, and pandas.read_csv.

阅读更多关于如何使用 Pandas read_csv 读取 CSV 文件.

我们将使用一个样本文件有 1000 行和 10 列。


import csv
import pandas as pd
import timeit

# Using open()
def read_with_open():
    with open('data.csv', 'r') as file:
        return file.readlines()

# Using csv.reader
def read_with_csv_reader():
    with open('data.csv', 'r') as file:
        return list(csv.reader(file))

# Using csv.DictReader
def read_with_csv_dictreader():
    with open('data.csv', 'r') as file:
        return list(csv.DictReader(file))

# Using pandas read_csv
def read_with_pandas():
    return pd.read_csv('data.csv')

print('open():', timeit.timeit(read_with_open, number=1000))
print('csv.reader:', timeit.timeit(read_with_csv_reader, number=1000))
print('csv.DictReader:', timeit.timeit(read_with_csv_dictreader, number=1000))
print('pandas read_csv:', timeit.timeit(read_with_pandas, number=1000))
  

Output:


open(): 1.220612900040578
csv.reader: 3.8335254000267014
csv.DictReader: 4.351687000016682
pandas read_csv: 4.525356799946167
  

open()速度最快,但提供的功能最少。pandas.read_csv提供最多的功能,但对于简单的任务可能会较慢。

 

基准写作

写入 CSV 文件也有不同的方法。我们来比较一下open(), csv.writer, csv.DictWriter, and pandas.to_csv.

阅读有关如何使用编写 CSV 文件的更多信息熊猫 to_csv.

我们将使用上述基准测试中使用的相同示例文件来写入其内容。


import csv
import pandas as pd
import timeit

# Read the data from sample.csv
with open('sample.csv', 'r') as file:
    reader = csv.DictReader(file)
    data = [row for row in reader]

# Using open()
def write_with_open():
    with open('output.csv', 'w') as file:
        for row in data:
            file.write(','.join(map(str, row.values())) + '\n')

# Using csv.writer
def write_with_csv_writer():
    with open('output.csv', 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(data[0].keys())  # Write headers
        for row in data:
            writer.writerow(row.values())

# Using csv.DictWriter
def write_with_csv_dictwriter():
    with open('output.csv', 'w', newline='') as file:
        writer = csv.DictWriter(file, fieldnames=data[0].keys())
        writer.writeheader()
        writer.writerows(data)

# Using pandas to_csv
def write_with_pandas():
    df = pd.DataFrame(data)
    df.to_csv('output.csv', index=False)

print('open():', timeit.timeit(write_with_open, number=1000))
print('csv.writer:', timeit.timeit(write_with_csv_writer, number=1000))
print('csv.DictWriter:', timeit.timeit(write_with_csv_dictwriter, number=1000))
print('pandas to_csv:', timeit.timeit(write_with_pandas, number=1000))
  

Output:


open(): 4.888178199995309
csv.writer: 6.31797530001495
csv.DictWriter: 8.040658099984284
pandas to_csv: 7.672513599973172
  

同样,这些时间安排反映了简单性和功能性之间的权衡。open()速度更快,但需要手动处理,而pandas.to_csv以牺牲性能为代价提供更多功能。

 

csv.reader 不工作(问题和修复)

文件未找到:确保 CSV 文件的名称和路径正确。如果 CSV 文件与 Python 脚本不在同一目录中,您将需要提供该文件的完整路径。

编码错误:如果您的 CSV 文件包含特殊字符,您可能会遇到编码问题。您可以在打开文件时指定编码:


with open('file.csv', 'r', encoding='utf-8') as file:  

分隔符问题:如果您的 CSV 文件使用逗号以外的分隔符,则需要在创建时指定该分隔符csv.reader object:


reader = csv.reader(file, delimiter=';')  

换行问题:有时,处理换行符的方式可能会在读取 CSV 文件时引起问题。您可以添加newline=''打开文件时的参数来处理此问题:


with open('file.csv', 'r', newline='') as file:
  

 

csv.writer 不工作(问题和修复)

文件权限错误:如果您尝试写入没有权限的位置,您将遇到错误。尝试写入您知道自己具有写入权限的位置。

缺少“换行符”参数:写入 CSV 文件时,通常建议包含newline=''打开文件时。这有助于确保在不同平台上一致地处理换行符。

在“读取”模式文件中写入:确保您使用以下命令打开文件'w' or 'a'(写入或追加模式)而不是'r'(阅读模式)。

数据结构不正确:确保您尝试写入的数据格式正确,通常是列表列表,其中每个内部列表代表 CSV 中的一行。

在其他地方打开 CSV 文件:如果您尝试写入的文件在另一个程序(例如 Excel)中打开,您可能会遇到问题。在写入文件之前,请确保该文件已在其他程序中关闭。

指定分隔符:如果您需要使用不同的分隔符(例如,用分号而不是逗号)编写 CSV 文件,您可以指定delimiter范围:


writer = csv.writer(file, delimiter=';')  

特殊字符编码:如果您要处理特殊字符,请确保使用适当的编码。您可以在打开文件时指定编码:


with open('file.csv', 'w', newline='', encoding='utf-8') as file:  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 处理 CSV:综合教程 的相关文章

  • 在 sympy 绘图中,如何获得具有固定纵横比的绘图?

    如果我用这个片段画一个圆 from sympy import x y symbols x y p1 plot implicit Eq x 2 y 2 1 aspect ratio 1 1 我会得到一个像这样的图形窗口 现在长宽比不是我所期望
  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • Python 如果 kwargs 中的 key 并且 key 为 true

    if force in kwargs and kwargs force is True 感觉应该有更好的方法来编写这个条件 因为我重复了键和变量 假设您确实想检查返回的关键字参数是否is True 这是另一种稍微不同的方式 if kwarg
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • matplotlib get_color 用于子图

    我正在按照这里的教程进行操作 https matplotlib org gallery ticks and spines multiple yaxis with spines html https matplotlib org galler
  • matplotlib 的 pcolor 中的白线

    在某些 pdf 查看器 例如 OSX 上的 Preview 中 使用以下命令绘制的图matplotlib的 pcolor 有白线 见下图 我怎样才能摆脱它们 源代码非常简单 选择任何数据x y z import matplotlib mat
  • 为什么 np.linalg.norm(..., axis=1) 比写出向量范数公式慢?

    标准化矩阵的行X对于单位长度 我通常使用 X np linalg norm X axis 1 keepdims True 在尝试优化算法的此操作时 我非常惊讶地发现在我的机器上写出标准化的速度大约快了 40 X np sqrt X 0 2
  • PRAW 出现 SSLError?

    我正在尝试开始使用 PRAW 但在使用 login 时遇到问题 我有以下代码 import praw r praw Reddit This is a test bot r login myRedditUsername password 我收
  • Django 单元测试数据库没有被拆除?

    我编写了一些单元测试来测试我的 Django 应用程序 特别是一个测试套件中包含大量代码setUp 功能 所述代码的目的是为数据库创建测试数据 是的 我了解固定装置 并且选择在这种情况下不使用它们 当我运行单元测试套件时 运行的第一个测试通
  • Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

    我正在从源安装tensorflow 文档 https www tensorflow org versions r0 10 get started os setup html installing from sources Cuda驱动版本
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • Odoo:如何覆盖原始功能

    在 Odoo 中 每次打开产品表单时都会计算产品的数量 这发生在模型中product product gt function product available 该函数返回一个名为 res 的字典 Example res 8 qty ava
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 更改 Windows 上的 virtualenv 文件夹

    计算机修复后 我的 python 项目目录 Windows 发生了变化 比如从 d 到 f 现在我所有的 virtualenv 都坏了 激活 env 后 virtualenv 中的项目无法找到依赖项 并且自定义脚本 来自 env scrip
  • Python:使用Excel CSV文件仅读取某些列和行

    虽然我可以读取 csv 文件而不是读取整个文件 但如何仅打印某些行和列 想象一下这是 Excel A B C D E State Heart Disease Rate Stroke Death Rate HIV Diagnosis Rate
  • 从 Cython 代码生成 SIMD 指令

    我需要概述在高性能数字代码中使用 Cython 可以获得的性能 我感兴趣的事情之一是找出优化的 C 编译器是否可以对 Cython 生成的代码进行矢量化 所以我决定写下面的小例子 import numpy as np cimport num
  • Python,质数检查器[重复]

    这个问题在这里已经有答案了 你好 我正在创建一个函数来检查一个数字是否是素数 但它告诉我 9 是一个素数 def eprimo num if num lt 2 return False if num 2 return True else f
  • 添加条件计数器:基于其他列的值的计数器列

    我有一张这样的桌子 id id2 val a red apple a red orange b blue fish c violet beef a yellow banana a black pork 我想根据 id 和 id2 的值创建一
  • 根据键的重复值从列表中删除字典

    我是Python新手 假设我有以下字典列表 mydictList a 1 b 2 c 3 a 2 b 2 c 4 a 2 b 3 c 4 从上面的列表中 我想删除具有相同键 b 值的字典 所以结果列表应该是 mydictList a 1 b

随机推荐

  • 如何在 Fedora Linux 上安装 Git

    Git 是一个分布式版本控制系统 广泛应用于软件开发和其他协作项目 在本指南中 我们将介绍在 Fedora Linux 上安装 Git 的两种方法 使用官方存储库和从最新源代码编译 先决条件 确保您有一个运行 Fedora Linux 的系
  • 如何在 Python 中计算两个日期之间的天数

    在 Python 中处理日期和时间时 计算两个日期之间的天数是一项常见任务 无论您是构建预订系统 日程安排工具还是任何其他涉及日期和时间的应用程序 计算两个日期之间的天数都是一个关键功能 在本文中 我们将讨论如何在 Python 中计算两个
  • 什么是中间人 (MITM) 攻击?

    A 中间人 MITM 攻击是一种常见的网络安全威胁 如果处理不当 可能会造成严重后果 在这种类型的攻击中 恶意行为者会拦截 中继并可能改变认为彼此直接通信的两方之间的通信 本文将深入探讨 MITM 攻击带来的威胁 攻击者使用的技术以及个人和
  • 如何利用技术进步实现完美的远程办公

    远程工作并不是一个新趋势 作家 记者和艺术家总是有机会在舒适的家中工作 尽管如此 远程办公始终与技术密切相关 在过去 远程工作人员依赖邮件服务和交通 随着这两个领域变得越来越好 越来越多的人能够在家执行工作任务 然而 直到互联网的出现 这种
  • 如何在 Debian 9 上设置 Apache 虚拟主机

    在本教程中 我们将引导您了解如何在 Debian 9 上设置 Apache 虚拟主机 Apache 虚拟主机允许您在一台计算机上托管多个域 使用虚拟主机时 您可以为每个域或子域指定不同的文档根 包含网站文件的目录 创建单独的安全策略 使用不
  • 如何在 CentOS 8 上安装 R

    R 是一种开源编程语言和免费环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本文介绍如何在 CentOS 8 上安装 R 先决条件 在继续本教程之前 请确保您已满足
  • 如何更改 SFTP 端口

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密连接在两台主机之间传输文件 它还允许您对远程文件执行各种文件操作并恢复文件传输 SFTP 可用作旧版 FTP 协议的替代品 它具有 FTP 的所有功能 但连接更安全 本文介绍如
  • 如何在 Ubuntu 18.04 上设置或更改时区

    在 Ubuntu 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 使用正确的时区对于许多与系统相关的任务和流程都很重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于相同的时区 本教程演示如
  • 如何在 Debian 9 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中 我们将指导您如何安装Yarn在 Debian 9 系统上
  • 如何在 Ubuntu 18.04 上安装 Django

    Django 是一个免费开源的高级 Python Web 框架 旨在帮助开发人员构建安全 可扩展和可维护的 Web 应用程序 有不同的方法来安装 Django 具体取决于您的需要 它可以在系统范围内安装 也可以使用 pip 安装在 Pyth
  • 如何在 Linux 中添加目录到 PATH

    当您在命令行上键入命令时 您基本上是在告诉 shell 运行具有给定名称的可执行文件 在Linux中 这些可执行程序就像ls find file和其他文件 通常位于系统上的几个不同目录中 存储在这些目录中的任何具有可执行权限的文件都可以从任
  • 如何在 CentOS 8 上设置或更改时区

    使用正确的时区对于许多与系统相关的任务和流程至关重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于同一系统的时区 在 CentOS 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 本文介绍
  • Python range() 函数

    蟒蛇rangetype 通过定义范围的起点和终点来生成整数序列 它通常与for循环迭代数字序列 range 在 Python 2 和 3 中的工作方式有所不同 在Python 2中 有两个函数可以让你生成整数序列 range and xra
  • Linux 中的正常运行时间命令

    在本教程中 我们将介绍uptime命令 顾名思义 uptime命令显示系统已经运行了多长时间 它还显示当前时间 登录用户数以及过去 1 5 和 15 分钟的系统负载平均值 如何使用正常运行时间命令 uptime 命令的语法如下 uptime
  • 如何在 CentOS 7 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种标准的客户端 服务器网络协议 允许用户在远程网络之间传输文件 有多种可用于 Linux 的开源 FTP 服务器 最流行和最广泛使用的是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在
  • Python while 循环

    循环是编程语言的基本概念之一 当您想要多次重复特定的代码块直到满足给定条件时 循环会很方便 Python中有两种基本的循环结构 for and while loops 本教程涵盖了以下基础知识whilePython 中的循环 我们还将向您展
  • NumPy loadtxt 教程(从文件加载数据)

    在之前的教程中 我们讨论过NumPy 数组 我们看到了它如何使读取 解析和对数字数据执行操作的过程变得轻而易举 在本教程中 我们将讨论 NumPy loadtxt 方法 该方法用于解析文本文件中的数据并将其存储在 n 维 NumPy 数组中
  • Linux Bash 脚本编写第 3 部分 – 参数和选项

    到目前为止 您已经了解了如何编写无需用户输入即可完成工作的 Linux bash 脚本 今天我们将继续我们的 Linux bash 脚本系列 如果您想了解我们在谈论什么 我建议您查看之前的帖子 Bash 脚本基础知识 Bash 脚本 For
  • Pythonnamedtuple(将元组提升到一个新的水平)

    在本教程中 我们将深入研究命名元组 它们是什么 如何创建和操作它们 以及何时使用它们 或不使用它们 命名元组是Python内置的一部分收藏模块 并且它们提供了一种将数据捆绑在一个名称下的便捷方法 它们是 Python 内置元组数据类型的子类
  • 使用 Python 处理 CSV:综合教程

    CSV 逗号分隔值 文件是存储和共享表格数据的最常见方法之一 这些文件由行和列组成 其中每行代表一个记录 列包含由分隔符 通常是逗号 分隔的值 Python 提供了多种内置方法来处理 CSV 文件 使您可以高效地读取 写入和操作数据 本教程