我正在尝试打开和修改csv文件中的数据。我正在努力学习使用csv模块,我对它几乎没有经验。
基本上我试图完成的是让程序打开一个csv,然后打开第二个csv来比较第0列中第一个csv中的数据和第二个csv中的排序矩阵。如果第0列的行中的数据与第二个csv文件的行/列0匹配,则它将从第1列中获取第二个csv中的数据,并将其替换为原始csv文件中的数据。
我能够在不使用带有以下代码的csv模块的情况下完成此任务。
file = open("needs_convertedTest.csv","r")
newFile = []
for line in file:
data = line.split(",")
file2 = open("options.csv","r")
for choice in file2:
dataOption = choice.split(",")
if dataOption[0] in data[0]:
docType = dataOption[1].strip("\n")
newLine = "%s,%s,%s,%s,%s,%s,%s,%s,%s" %(docType,data[1],data[2],data[3],
data[4],data[5],data[7],data[6],data[8])
newFile.append(newLine)
file = open("needs_convertedTest.csv","w")
for line in newFile:
file.write(line)
file.close()
使用此代码的问题在于,有一些文档类型在名称上相似,并且由于某种原因,程序会创建其中一个的两倍,如下所示。
MTG Closing | Margarett Jackson | 123-45-6789 | 1410000625 | 111814 | 18 | G:\Downloads\Exports\Images\Loan_1410000625\Good Faith Estimate.pdf | 16
MTG Closing | Margarett Jackson | 123-45-6789 | 1410000625 | 111814 | 18 | G:\Downloads\Exports\Images\Loan_1410000625\Acknowledgement of Receipt of Good Faith Estimate.pdf | 16
MTG Disclosures | Margarett Jackson | 123-45-6789 | 1410000625 | 111814 | 18 | G:\Downloads\Exports\Images\Loan_1410000625\Acknowledgement of Receipt of Good Faith Estimate.pdf | 16
第一行和第三行是正确的。第二个是第三个副本,但文档类型不正确,MTG结算。
options.csv文件的格式如下。
MTG Closings | Good Faith Estimate
MTG Disclosures | Acknowledgement of Receipt of Good Faith Estimate
接下来是包含类似数据的其他几行,程序使用这些行在needs_converted.csv文件中进行数据的比较和替换。
该程序仅处理数据[0]中的信息,即第一列。
这是我编写的程序,试图使用csv模块执行相同的任务。
import csv
newFile=[]
with open('needs_converted.csv', 'w', newline='') as csvfile:
data = csv.writer(csvfile, delimiter=' ',
quotechar='"', quoting=csv.QUOTE_ALL)
with open('options.csv','r',) as csvfile2:
dataOption = csv.reader(csvfile2, delimiter=' ',
quotechar='"', quoting=csv.QUOTE_ALL)
next(reader,None)
if dataOption[0] in data[0]:
docType = dataOption[1].strip("\n")
newLine = "%s,%s,%s,%s,%s,%s,%s,%s,%s" %(docType,data[1],data[2],data[3],
data[4],data[5],data[7],data[6],data[8])
newFile.append(newLine)
如果有人可以帮我构建代码来通过csv模块实现这一目标,我将非常感激!
谢谢, 最大
答案 0 :(得分:0)
在您正在循环的输入文件中直接替换行替换可能会很棘手(尽管我们有一个支持fileinput更新选项的inplace模块)。 / p>
相反,构建 new 输出文件通常要简单得多。 csv module writer objects可让您毫不费力地输出CSV格式的线条。完全填充新文件后,只需使用shutil.move()将原始文件替换为新文件。
希望这能让你重回正轨: - )