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
循环的每次迭代中打开(和关闭)输出文件。在你的循环之前打开它一次,写下你必须写的东西,然后在你离开循环时关闭它。
我正在编写一个具有 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
循环的每次迭代中打开(和关闭)输出文件。在你的循环之前打开它一次,写下你必须写的东西,然后在你离开循环时关闭它。