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

Python - Script that appends rows; checks for duplicates before writing

我正在编写一个具有 for 循环的脚本,用于从文件夹中的每个 'data_i.csv' 文件中提取变量列表,然后将该列表作为新行追加到单个 'output.csv' 中文件。

我的objective是定义文件的headers一次,然后将数据追加到'output.csv'container-file,这样就可以作为一个标准的backlog了测量。 我第一次 运行 脚本时,它会添加文件夹中的所有文件。下次我 运行 它时,我希望它只追加此后添加的文件。我认为这样做的一种方法是检查重复项,但到目前为止我找到的代码只搜索了连续的重复项。

你有什么建议吗?

到目前为止,我是这样做的:

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()

您可以跟踪已处理的每个文件的名称。如果此日志文件不需要人类可读,您可以使用 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 循环的每次迭代中打开(和关闭)输出文件。在你的循环之前打开它一次,写下你必须写的东西,然后在你离开循环时关闭它。