【发布时间】:2017-08-23 17:14:51
【问题描述】:
我正在比较 2 个 CSV 文件,一个已经存在,另一个是通过运行这段代码生成的。基本上,它应该通过最新的工作表并查看是否添加了新行(仅限 A 列)并制作一个差异文件并将新添加的行从最新文件复制到差异文件。她是我正在使用的代码:
import os, csv, time, glob
timestr = time.strftime("%Y%m%d-%H%M%S")
f=open("B:/Test_folder/parse_file1_"+timestr+'.csv', 'w+', newline='' )
w=csv.writer(f)
for dirs in os.listdir("B:/folder1"):
w.writerow([dirs])
newest = max(glob.iglob('B:/Test_folder/parse_file1_*.csv'), key=os.path.getctime)
oldest = min(glob.iglob('B:/Test_folder/parse_file1_*.csv'), key=os.path.getctime)
with open(oldest, 'r') as t1, open(newest, 'r') as t2:
fileone = t1.readlines()
filetwo = t2.readlines()
with open('B:/Test_folder/file1_diff.csv', 'w') as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line)
outFile.close()
最旧的文件(已经存在)= parse_file1_20170328_currentime
A
B
C
和 最新文件 = parse_file2_20170329_currentime
A
B
C
D
预期的输出应该是: file1_diff
D
我的问题是,即使它正在创建一个差异文件,它也不会将 D 复制到 CSV 文件中。 我这里的逻辑搞砸了,请帮忙
谢谢
【问题讨论】:
-
请添加trace以确定
oldest和newest的值是什么,如果他们的名字看起来不错,fileone和filetwo的值是什么,并分享如果问题仍然不明显,那就在这里。 -
你为什么不在第一个文件打开时使用
with?由于文件没有关闭,我怀疑数据没有正确刷新。 -
另外,
outFile.close()毫无意义,因为在退出最后一个with块时,outFile已经关闭。 -
感谢大家的帮助,虽然您的建议很受赞赏,但问题在于代码的执行周期。它无法写入差异文件,因为线程仍在为写入目的保留最新文件。我把程序分成两部分。一个用于创建新文件(在遍历目录时),另一个代码将新文件与旧文件进行比较(上述代码成功完成后将调用这段代码)。这解决了问题。我知道这不是我能写的最干净的代码,但我仍然是 python 和学习的新手,
标签: python python-2.7 excel-2010 notepad++ python-3.4