python 文件操作(csv和excel大型文件读取)

使用csv模块

首先,我们需要导入csv模块:

import csv

读取CSV文件

要读取一个CSV文件,可以使用csv.reader()函数。该函数接受一个文件对象作为参数,并返回一个可迭代的行列表。每一行都是一个由列数据组成的列表。例如,如果我们有一个名为data.csv的CSV文件,其中包含以下内容:

Name,Age,Gender
John,30,M
Lisa,25,F
Mike,40,M

我们可以使用以下代码读取它:

with open('data.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

输出结果为:

['Name', 'Age', 'Gender']
['John', '30', 'M']
['Lisa', '25', 'F']
['Mike', '40', 'M']

可以看到第一行是表头,后面的每一行都是数据行。

写入CSV文件

要写入CSV文件,可以使用csv.writer()函数。该函数接受一个文件对象和一个选项(如delimiter、quotechar等)作为参数,并返回一个writer对象。然后,可以使用writer对象的writerow()方法来写入一行数据。

例如,如果我们有以下数据:

data = [
    ['Name', 'Age', 'Gender'],
    ['John', 30, 'M'],
    ['Lisa', 25, 'F'],
    ['Mike', 40, 'M']
]

我们可以使用以下代码将数据写入CSV文件:

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

上面的newline=''是为了避免在Windows系统下出现多余的空行。

使用openpyxl模块

要使用openpyxl模块,我们首先需要安装它。可以使用以下命令:

pip install openpyxl

然后,我们需要导入openpyxl模块:

import openpyxl

读取Excel文件

要读取一个Excel文件,可以使用openpyxl.load_workbook()函数。该函数接受一个文件名作为参数,并返回一个Workbook对象。然后,可以使用Workbook对象的active属性来获取当前工作表(即第一个工作表),或者使用get_sheet_by_name()方法来获取指定名称的工作表。

例如,如果我们有一个名为data.xlsx的Excel文件,其中包含以下内容:

NameAgeGender
John 30 M
Lisa 25 F
Mike 40 M

我们可以使用以下代码读取它:

workbook = openpyxl.load_workbook('data.xlsx')
sheet = workbook.active

for row in sheet.iter_rows():
    for cell in row:
        print(cell.value, end='\t')
    print()

输出结果为:

Name    Age    Gender    
John    30    M    
Lisa    25    F    
Mike    40    M    

可以看到第一行是表头,后面的每一行都是数据行。

写入Excel文件

要写入Excel文件,可以使用openpyxl.Workbook()函数创建一个新的Workbook对象。然后,可以使用Workbook对象的active属性来获取当前工作表,并使用append()方法将数据添加到工作表中。

例如,如果我们有以下数据:

data = [
    ['Name', 'Age', 'Gender'],
    ['John', 30, 'M'],
    ['Lisa', 25, 'F'],
    ['Mike', 40, 'M']
]

我们可以使用以下代码将数据写入Excel文件:

workbook = openpyxl.Workbook()

接下来,我们可以使用Workbook对象的active属性来获取当前工作表,并使用append()方法将数据添加到工作表中。要保存Excel文件,可以使用Workbook对象的save()方法。

sheet = workbook.active

for row in data:
    sheet.append(row)

workbook.save('output.xlsx')

这将在当前目录下创建一个名为output.xlsx的新Excel文件,并将数据写入其中。

循环读取和写入数据

如果我们需要循环读取或写入大量数据,可以使用for循环和适当的条件语句来处理它们。例如,在读取CSV文件时,我们可以跳过第一行(即表头),然后将每一行的数据存储在一个列表中:

with open('data.csv', 'r') as f:
    reader = csv.reader(f)
    header = next(reader)  # 跳过第一行
    data = []
    for row in reader:
        data.append(row)

在写入CSV文件时,我们可以将数据从一个列表中读取出来,并将其写入CSV文件:

headers = ['Name', 'Age', 'Gender']
data = [
    ['John', 30, 'M'],
    ['Lisa', 25, 'F'],
    ['Mike', 40, 'M']
]

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(headers)
    for row in data:
        writer.writerow(row)

在读取Excel文件时,我们可以将数据从一个工作表中读取出来,并将其存储在一个列表中:

workbook = openpyxl.load_workbook('data.xlsx')
sheet = workbook.active

header = [cell.value for cell in sheet[1]]
data = []
for row in sheet.iter_rows(min_row=2):
    row_data = [cell.value for cell in row]
    data.append(row_data)

在写入Excel文件时,我们可以将数据从一个列表中读取出来,并将其写入工作表中:

headers = ['Name', 'Age', 'Gender']
data = [
    ['John', 30, 'M'],
    ['Lisa', 25, 'F'],
    ['Mike', 40, 'M']
]

workbook = openpyxl.Workbook()
sheet = workbook.active

sheet.append(headers)
for row in data:
    sheet.append(row)

workbook.save('output.xlsx')

需要注意的是,在处理大量数据时,可能会遇到内存不足的问题。为了解决这个问题,可以使用一些技巧,如分块读取或写入数据,或者使用专门设计的库,如pandas

分块读取和写入数据

如果我们处理的数据量非常大,可能无法将所有数据同时存储在内存中。在这种情况下,可以使用分块读取或写入数据的方法,即一次只处理一部分数据。

例如,在使用csv模块读取大型CSV文件时,可以使用以下代码:

with open('data.csv') as f:
    reader = csv.reader(f)
    header = next(reader)
    chunk_size = 1000
    while True:
        data_chunk = []
        for i in range(chunk_size):
            try:
                row = next(reader)
                data_chunk.append(row)
            except StopIteration:
                break
        if not data_chunk:
            break
        process_data(data_chunk)  # 处理数据

在这个例子中,我们使用了一个while循环来不断读取数据块,并使用process_data()函数来处理数据。chunk_size变量指定每个数据块的大小。

类似地,在使用openpyxl模块读取大型Excel文件时,也可以使用以下代码:

workbook = openpyxl.load_workbook('data.xlsx')
sheet = workbook.active

header = [cell.value for cell in sheet[1]]

chunk_size = 1000
max_row = sheet.max_row
for i in range(2, max_row+1, chunk_size):
    rows = sheet.iter_rows(min_row=i, max_row=min(i+chunk_size-1, max_row))
    data_chunk = [[cell.value for cell in row] for row in rows]
    process_data(data_chunk)  # 处理数据

在这个例子中,我们使用了一个for循环来不断读取数据块,并使用process_data()函数来处理数据。chunk_size变量指定每个数据块的大小。

类似地,在写入大型CSV或Excel文件时,也可以使用分块写入数据的方法,即一次只写入一部分数据。

使用pandas库

另一个处理大量数据的好工具是pandas库,它提供了一种高效的方式来处理和分析表格数据。如果您需要处理大量数据,请考虑使用pandas库。

例如,要读取CSV文件并将其转换为DataFrame对象,可以使用以下代码:

import pandas as pd

df = pd.read_csv('data.csv')

然后,可以像处理常规Python列表一样处理DataFrame对象,例如使用head()方法查看前几行:

print(df.head())

这个例子中,我们使用to_csv()方法将DataFrame对象写入CSV文件,并设置index=False以避免写入行号。

要将DataFrame对象写入CSV文件,可以使用to_csv()方法:

df.to_csv('output.csv', index=False)

在这个例子中,我们导入了pandas库,并使用read_csv()函数将CSV文件读取为DataFrame对象。

 

 

pandas库也可以用于处理Excel文件。要读取Excel文件并将其转换为DataFrame对象,可以使用以下代码:

import pandas as pd

df = pd.read_excel('data.xlsx', engine='openpyxl')

在这个例子中,我们使用了engine='openpyxl'参数来指定使用openpyxl模块读取Excel文件(如果未指定该参数,则默认使用xlrd模块)。

print(df.head())

要将DataFrame对象写入Excel文件,可以使用以下代码:

df.to_excel('output.xlsx', index=False)

在这个例子中,我们使用to_excel()方法将DataFrame对象写入Excel文件,并设置index=False以避免写入行号。

需要注意的是,在使用pandas库处理大量数据时,仍然可能会出现内存不足的问题。在这种情况下,可以使用类似分块读取和写入数据的方法,即一次只处理一部分数据。pandas库提供了许多有用的函数和方法,可以轻松地进行数据分组、聚合和过滤等操作,因此非常适合处理大型数据集。

下面给出一个使用pandas库处理大型CSV文件的例子。假设我们有一个大小为10GB的CSV文件,其中包含以下数据:

id,name,age,gender
1,Alice,25,F
2,Bob,30,M
3,Charlie,40,M
4,Dave,35,M
5,Eve,28,F
6,Frank,45,M
...

我们可以使用以下代码将CSV文件读取为DataFrame对象,并仅选择需要的列:

import pandas as pd

chunk_size = 1000000
reader = pd.read_csv('data.csv', usecols=['name', 'age', 'gender'], chunksize=chunk_size)

for i, chunk in enumerate(reader):
    # 处理数据块
    process_data(chunk)

在这个例子中,我们指定了要读取的列,并使用chunksize参数将CSV文件分成了大小为chunk_size的块。然后,我们使用pd.read_csv()函数返回一个可迭代的TextFileReader对象,并使用enumerate()函数获取每个数据块的索引和内容。

接下来,我们将每个数据块传递给process_data()函数进行处理。在该函数中,我们可以进一步对数据进行分组、聚合等操作,例如计算每个年龄段的平均年龄:

def process_data(data):
    # 计算每个年龄段的平均年龄
    age_mean = data.groupby(pd.cut(data['age'], bins=[0, 30, 40, float('inf')]))['age'].mean()
    print(age_mean)

在这个例子中,我们使用pd.cut()函数将年龄数据分成三个年龄段(0-30岁、31-40岁、41岁及以上),并使用groupby()方法按年龄段进行分组。然后,我们使用mean()方法计算每个年龄段的平均年龄,并输出结果。

使用pandas库处理大型数据集可以使代码更简洁、更易读,并且可以轻松地进行数据处理和可视化等操作。因此,如果您需要处理大量数据,请考虑使用pandas库。

posted @ 2023-04-30 21:15  乐瓜乐虫  阅读(799)  评论(0编辑  收藏  举报