Python - 追加行的脚本;在写之前检查重复项

时间:2016-02-02 19:11:58

标签: python csv export-to-csv

我正在编写一个带有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()

1 个答案:

答案 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循环的每次迭代中打开(并关闭)输出文件。在你的循环之前打开它一次,写下你要写的东西,然后在你离开循环时关闭它。