修改csv

时间:2017-06-30 20:39:18

标签: python python-3.x csv

我正在尝试打开和修改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模块实现这一目标,我将非常感激!

谢谢, 最大

1 个答案:

答案 0 :(得分:0)

在您正在循环的输入文件中直接替换行替换可能会很棘手(尽管我们有一个支持fileinput更新选项的inplace模块)。 / p>

相反,构建 new 输出文件通常要简单得多。 csv module writer objects可让您毫不费力地输出CSV格式的线条。完全填充新文件后,只需使用shutil.move()将原始文件替换为新文件。

希望这能让你重回正轨: - )