首页 > 解决方案 > Python:csv到pickle表示,回到csv文件内容混乱

问题描述

我正在尝试腌制一个 csv 文件,然后将其腌制表示转回 csv 文件。

这是我想出的代码:

from pathlib import Path
import pickle, csv

csvFilePath = Path('/path/to/file.csv')

pathToSaveTo = Path('/path/to/newFile.csv')

csvFile = open(csvFilePath, 'r')
f = csvFile.read() 
csvFile.close() 

f_pickled = pickle.dumps(f) 


f_unpickled = pickle.loads(f_pickled) 

#save unpickled csv file
new_csvFile = open(pathToSaveTo, 'w')
csvWriter = csv.writer(new_csvFile)
csvWriter.writerow(f_unpickled)
new_csvFile.close()

newFile.csv 已创建,但其内容存在两个问题:

  1. 现在每个字符之间都有一个逗号。
  2. 现在每行后面都有一对引号。 file.csv 的屏幕截图

newFile.csv 的屏幕截图

我必须对我的代码进行哪些更改才能获得 file.csv 的精确副本?

标签: pythoncsvpickle

解决方案


问题是您正在读取文件的原始文本,f = csvFile.read()然后,在写入时,您正在提供数据,这是一个单一的文本块,全部在一个字符串中,虽然是一个 CSVwriter对象。CSVwriter会将字符串视为可迭代,并将每个可迭代元素写入 CSV 单元格。然后,第二行没有数据,该过程结束。

dumps你执行的泡菜loads只是一个无操作:那里什么都没有发生,如果有任何问题,那宁愿是由于你传递给的对象中有一些不可腌制的对象引用dumps:你会得到一个异常,而不是调用时的不同数据loads

现在,不告诉你为什么要这样做,以及你为数据计划了哪些中间步骤,很难告诉你:你正在执行两个非操作:读取文件,酸洗和解开它的内容,以及写那些内容回磁盘。

什么时候需要将这些数据结构化为行或 CSV 单元格?只需在需要的地方应用适当的转换,就完成了。

如果您希望整个“什么都不做”循环通过实际将 CSV 数据分隔在 Python 中的不同元素中,您可以执行:

from pathlib import Path
import pickle, csv

csvFilePath = Path('file.csv')

pathToSaveTo = Path('newFile.csv')

data = list(csv.reader(open(csvFilePath))) 
# ^consumes all iterations of the reader: each iteration is a row, composed of a list where each cell value is a list elemnt
pickled_data = pickle.dumps(data)
restored_data = pickle.loads(pickled_data)
csv.writer(open(pathToSaveTo, "wt")).writerows(restored_data)

认为在这个片段中,数据是通过 csv.reader 读取的,而不是直接读取的。将其包装在列表调用中会导致在列表项中读取和转换所有行 - 因为阅读器是一个惰性迭代器(否则它不会是可挑选的,因为它的状态所依赖的属性之一是打开的文件)


推荐阅读