用Python读取csv文件的列
我正在使用Python的CSV模块来遍历某一列的行。
我需要做的事情是:
- 获取“title”这一列的第一行
- 去掉任何西班牙语字符(比如重音符号和Ñ)
- 去掉单引号
- 最后,把空格替换成短横线,并把所有字母转换成小写。
我在一个简单的测试文件中成功实现了这些功能,但那个文件不是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时,也会出现类似的错误。我现在明白了,这些方法只适用于字符串。
我该如何让这个代码正常工作呢?我搜索了一下,想把字典转换成字符串对象,但没有成功。
另外,任何关于如何优化和让我的代码更易读的建议也非常欢迎!
3 个回答
0
当你在使用一个函数时遇到问题,可以试着让它输出一些东西,而不是直接返回结果。这样,你就能确认它是否正常工作,并找出问题所在。你在一行代码里写了太多语句,这样会让你很难找到问题出在哪里。你知道什么是字典吗?当然,没有简单的方法可以把字典转换成字符串。你需要先弄清楚你想保留哪些数据。
另外,你是想写一个列表推导式吗?那你应该使用方括号。
1
line
是一个字典。你可能想在 line['title']
上调用 replace
方法。
1
根据新得到的信息,我觉得这个方法可能会更简单。
可以使用内置的函数' map'。关于' map'的具体功能,我就不多解释了,可以去查阅Python的官方文档。
我认为你可以这样做:
创建一个函数,这个函数可以接收一行数据或字典,然后把它处理成你想要的格式。
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)