将for循环的输出写入python中的csv

Posted

技术标签:

【中文标题】将for循环的输出写入python中的csv【英文标题】:Write output from for loop to a csv in python 【发布时间】:2019-07-20 20:53:34 【问题描述】:

我正在打开一个名为 Remarks_Drug.csv 的 csv,其中包含 产品名称 并映射 文件名 在连续的列中。我在产品栏目做一些操作 删除+ 字符后的所有字符串内容。从+ 中剥离字符串后 字符,我将结果存储在一个名为 product_patterns 的变量中。

现在我正在打开一个新的csv,我想将 for 循环的输出写入 两列,第一列包含product_patterns,第二列包含 对应的filenames

我现在得到的输出只是我正在寻找的output csv 的最后一行。 我认为我没有正确循环以便product_patterns 和文件名的每一行都得到 附加在output csv 文件中。

谁能帮帮我。

下面附上代码:

import csv


with open('Remarks_Drug.csv', newline='', encoding ='utf-8') as myFile:
    reader = csv.reader(myFile)
    for row in reader:
        product = row[0].lower()
        #print('K---'+ product)
        filename = row[1]
        product_patterns = ', '.join([i.split("+")[0].strip() for i in product.split(",")])


        #print(product_patterns, filename)

    with open ('drug_output100.csv', 'a') as csvfile:
        fieldnames = ['product_patterns', 'filename']
        print(fieldnames)
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        print(writer)
        #writer.writeheader()
        writer.writerow('product_patterns':product_patterns, 'filename':filename)

示例输入:

    Film-coated tablet + TERIFLUNOMIDE, 2011-07-18 - Received approval letter_EN.txt
    Film-coated tablet + VANDETANIB,             2013-12-14 RECD Eudralink_Caprelsa II-28 - RSI - 14.12.2017.txt
    Solution for injection + MenQuadTT, 395_EU001930-PIP01-16_2016-02-22.txt
    Solution for injection + INSULIN GLARGINE,  2017-11-4 Updated PR.txt
    Solution for injection + INSULIN GLARGINE + LIXISENATIDE,   2017 12 12 Email Approval Texts - SA1006-.txt

【问题讨论】:

你能发布示例数据吗? csv.DictWriter 为每一行使用一个字典(键是字段名称,值是相应单元格的值),而您只写了一行。 是的,我无法迭代它 在现有代码中添加示例数据。 因为你有一个列表而不是字典 【参考方案1】:
import csv
import pandas as pd

with open('Remarks_Drug.csv', newline='', encoding ='utf-8') as myFile:
    reader = csv.reader(myFile)
    mydrug = []
    for row in reader:
        product = row[0].lower()
        #print('K---'+ product)
        filename = row[1]
        product_patterns = ', '.join([i.split("+")[0].strip() for i in product.split(",")])
        mydrug.append([product_patterns, filename])

#     print(mydrug)

    df = pd.DataFrame(mydrug, columns=['product_patterns', 'filename'])
    print(df)
    df.to_csv('drug_output100.csv', sep=',', index=False)

这利用了pandas 库。如果您要处理大型csv 文件,使用pandas 在性能和内存方面将非常方便且高效。这只是上述情况的替代解决方案。

【讨论】:

【参考方案2】:

我希望这对您来说是正确的方法,如果不是,请告诉我,我们会检查。

import csv

with open('Remarks_Drug.csv') as myFile:
    reader = csv.reader(myFile)
    products_list = list()
    filenames_list = list()

    for row in reader:
        products_list.append(row[0].lower().split("+")[0].strip())
        filenames_list.append(row[1])

    for index, product in enumerate(products_list):
        with open ('drug_output100.csv', 'a') as csvfile:
            fieldnames = ['product_patterns', 'filename']
            print(fieldnames)
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            print(writer)
            writer.writerow('product_patterns':product, 'filename':filenames_list[index])
    打开 Remarks_Drug.csv 文件并创建两个列表来存储 根据您的喜好详细说明行值。 迭代产品列表并枚举它,以便您有一个索引 在文件名列表中使用。 打开输出文件并将结果附加到其中。

您还可以使用pandas 以更快、更智能的方式制作 csv 文件。

这里是 pandas 解决方案:

import pandas as pd

def select_real_product(string_to_elaborate):
    return string_to_elaborate.split('+')[0].strip()

df = pd.read_csv("Remarks_Drug.csv", delimiter=',', names=("product", "filename"))

df['product'] = df['product'].apply(select_real_product)

df.to_csv("drug_output100.csv", sep=',', na_rep='empty',index_label=False, index=False)

【讨论】:

完美运行。非常感谢。 还要检查 pandas 解决方案。我认为更好,与熊猫一起工作很有趣。你可以用 pandas 和 csv 文件做更多的事情。 谢谢。当然,如果我有任何疑问,我会与您核实并澄清 好吧,我认为 pandas 是最好的解决方案,对于最小的文件和最大的文件。 发生了什么?为什么您将我的答案删除为正确?

以上是关于将for循环的输出写入python中的csv的主要内容,如果未能解决你的问题,请参考以下文章

将for循环的输出写入多个文件

如何将 for 循环输出写入 csv 文件?

Python - 写入 CSV 文件和 for 循环

Powershell写入第一行但无法将后续行写入for循环中的文件

将 for 循环中的多个打印输出值存储到列表或变量中

我的 Python for 循环执行 5005 次,但它意味着执行 100 次 [关闭]