我正在编写一个带有for循环的脚本,以便从每个' data_i.csv'中提取变量列表。将文件放在一个文件夹中,然后将该列表作为新行添加到单个" output.csv'文件。
我的目标是定义文件的标题,然后将数据附加到" output.csv'容器文件,因此它将作为标准测量的积压工作。 我第一次运行脚本时会添加文件夹中的所有文件。下次我运行它时,我希望它只附加自那以后添加的文件。我认为这样做的一种方法是检查重复项,但到目前为止我找到的代码只搜索连续的重复项。
你有什么建议吗?
到目前为止我是如何做到的:
import csv, os
# Find csv files
for csvFilename in os.listdir('.'):
if not csvFilename.endswith('.csv'):
continue
# Read in csv file and choose certain cells
csvRows = []
csvFileObj = open(csvFilename)
csvData = csv.reader(csvFileObj,delimiter=' ',skipinitialspace='True')
csvLines = list(csvData)
cellID = csvLines[4][3]
# Read in several variables...
csvRows = [cellID]
csvFileObj.close()
resultFile = open("Output.csv", 'a') #open in 'append' modus
wr = csv.writer(resultFile)
wr.writerows([csvRows])
csvFileObj.close()
resultFile.close()
这是mgc的答案之后的最终剧本:
import csv, os
f = open('Output.csv', 'r+')
merged_files = csv.reader(f)
merged_files = list()
for csvFilename in os.listdir('.'):
if not csvFilename.endswith('_spm.txt'):
continue
if csvFilename in merged_files:
continue
csvRows = []
csvFileObj = open(csvFilename)
csvData = csv.reader(csvFileObj,delimiter=' ',skipinitialspace='True')
csvLines = list(csvData)
waferID = csvLines[4][3]
temperature = csvLines[21][2]
csvRows = [waferID,thickness]
merged_files.append(csvRows)
csvFileObj.close()
wr = csv.writer(f)
wr.writerows(merged_files)
f.close()
答案 0 :(得分:2)
您可以跟踪已处理的每个文件的名称。如果此日志文件不需要是人类可读的,则可以使用pickle。在脚本开始时,您可以执行以下操作:
import pickle
try:
with open('merged_log', 'rb') as f:
merged_files = pickle.load(f)
except FileNotFoundError:
merged_files = set()
然后您可以添加条件以避免以前处理过的文件:
if filename in merged_files: continue
然后,当您处理文件时,您可以这样做:
merged_files.add(filename)
并在脚本末尾跟踪变量(因此它将在下次使用时使用):
with open('merged_log', 'wb') as f:
pickle.dump(merged_files, f)
(但是您的问题还有其他选项,例如,您可以稍微更改文件的名称,例如将文件名从.csv
更改为.csv_
或移动已处理的文件在子文件夹等。)
此外,在您的问题示例中,我不认为您需要在for
循环的每次迭代中打开(并关闭)输出文件。在你的循环之前打开它一次,写下你要写的东西,然后在你离开循环时关闭它。