将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
文件,使用panda
s 在性能和内存方面将非常方便且高效。这只是上述情况的替代解决方案。
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章