python - 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 已创建,但其内容存在两个问题:
我必须对我的代码进行哪些更改才能获得 file.csv 的精确副本?
解决方案
问题是您正在读取文件的原始文本,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 读取的,而不是直接读取的。将其包装在列表调用中会导致在列表项中读取和转换所有行 - 因为阅读器是一个惰性迭代器(否则它不会是可挑选的,因为它的状态所依赖的属性之一是打开的文件)
推荐阅读
- python - 试图打印一个 int 但它出现:TypeError must be str, not float
- python - 如何在多用户使用的unix服务器上集中调度r和python脚本
- python - 如何在不覆盖结果的情况下抓取多个网页?
- node.js - 如何通过 pm2 启动 actionhero
- python - 如何从 python 以管理员身份运行 explorer.exe
- wordpress - 如何从 7 中调整联系人中的输入类型选择大小?
- javascript - 如何将绑定集合发送给子集合并允许本地操作而不改变父集合?
- c# - 获取将excel动态转换为数据表的问题
- visual-studio-2017 - Visual Studio 2017 SSDT 添加对脚本的引用
- python-3.x - python集合计数器无法显示直方图