我正在使用python的CSV模块迭代列的行。
我需要做的是:
我使用了一个简单的测试文件,而不是csv。我还设法在每个单独的行中打印每个标题。
但是现在我正在使用这段代码来浏览CSV文件(抱歉非常难看的代码,我是新手程序员):
import csv
import unicodedata
import ast
def strip_accents(s):
return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))
dic_read = csv.DictReader(open("output.csv", encoding = "utf8"))
for line in dic_read:
#print(line) #I get each line of the csv file as a dictionary.
#print(line["title"]) # I get only the "title" column on each line
line = line.replace(' ', '-').lower()
line = line.replace("´", "")
line = strip_accents(line)
fp=open("cleantitles.txt", "a")
fp.write(line)
fp.close()
我收到以下错误:
Traceback (most recent call last):
File "C:/csvreader3.py", line 15, in <module> line = strip_accents(line)
File "C:/csvreader3.py", line 7, in strip_accents
return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))
TypeError: must be str, not dict
当我尝试仅执行.replace时,我也遇到了类似的错误。我现在明白这些方法只适用于字符串。
我怎样才能让它发挥作用?我搜索了一种将字典转换为字符串对象的方法,但是没有用。
此外,欢迎任何批评优化和使我的代码更具可读性的批评!
答案 0 :(得分:1)
line
是一个词典。您可能希望在replace
上致电line['title']
。
答案 1 :(得分:1)
随着新信息的出现,我想您可能会发现这种方法更简单。
使用内置函数'map'。我将把“map”的内容解释为python文档。
以下是我认为你应该做的事情
创建一个函数,该函数接受一行/ dict并将其处理为您想要的格式
def strip_unwanted(line):
title = str(line['title']).replace(' ', '-').replace("´", "")
title = ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))
line['title'] = title
return line
with open("output.csv", encoding = "utf8") as input:
dic_entries = csv.DictReader(input)
# use the 'map' function
new_entries = map(strip_unwanted, dic_entries)
with open('some.csv', 'wb') as output:
writer = csv.DictWriter(output)
writer.writerows(new_entries)
答案 2 :(得分:0)
当你遇到函数问题时,尝试输出一些东西而不是试图返回它。这样,您可以验证它是否有效并隔离问题。你在一行上有太多的陈述。这使得很难知道问题出在哪里。你意识到dict是什么吗?当然,没有直接的方法将dict转换为字符串。您需要找出要保留的数据。
另外,你的意思是列表理解吗?那么你应该使用方括号。