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文件,其中包含以下内容:
Name | Age | Gender |
---|---|---|
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
库。