面试题答案
一键面试- 读取CSV文件并使用生成器逐行生成数据:
- 使用
csv.reader
结合生成器来逐行读取CSV文件,避免一次性将整个文件读入内存。 - 示例代码如下:
- 使用
import csv
def read_csv_generator(file_path):
with open(file_path, 'r', newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
yield row
- 对每行数据进行复杂计算和转换:
- 定义一个函数来处理这些复杂操作。例如,假设每行数据包含数字,需要将它们平方后求和。
- 代码如下:
def complex_calculation(row):
try:
numbers = [float(num) for num in row]
result = sum([num ** 2 for num in numbers])
return result
except ValueError:
return None
- 将处理后的数据存储到数据库:
- 这里以SQLite数据库为例。使用
sqlite3
模块,先连接数据库,然后使用executemany
方法批量插入数据(也可以逐行插入,但批量插入效率更高)。 - 完整代码如下:
- 这里以SQLite数据库为例。使用
import csv
import sqlite3
def read_csv_generator(file_path):
with open(file_path, 'r', newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
yield row
def complex_calculation(row):
try:
numbers = [float(num) for num in row]
result = sum([num ** 2 for num in numbers])
return result
except ValueError:
return None
def store_to_db(data_generator):
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS results (id INTEGER PRIMARY KEY AUTOINCREMENT, result REAL)')
data_to_insert = []
for row in data_generator:
result = complex_calculation(row)
if result is not None:
data_to_insert.append((result,))
if len(data_to_insert) >= 1000: # 每1000条数据批量插入
cursor.executemany('INSERT INTO results (result) VALUES (?)', data_to_insert)
conn.commit()
data_to_insert = []
if data_to_insert:
cursor.executemany('INSERT INTO results (result) VALUES (?)', data_to_insert)
conn.commit()
conn.close()
if __name__ == '__main__':
file_path = 'large_file.csv'
csv_generator = read_csv_generator(file_path)
store_to_db(csv_generator)
在上述代码中:
read_csv_generator
函数使用生成器逐行读取CSV文件。complex_calculation
函数对每行数据进行复杂计算和转换。store_to_db
函数将处理后的数据存储到SQLite数据库中,通过批量插入数据来提高效率,同时也能有效避免内存溢出问题。在实际应用中,数据库连接部分可根据具体使用的数据库(如MySQL、PostgreSQL等)进行调整。