用Python读取csv文件的列

1 投票
3 回答
3766 浏览
提问于 2025-04-16 22:34

我正在使用Python的CSV模块来遍历某一列的行。

我需要做的事情是:

  1. 获取“title”这一列的第一行
  2. 去掉任何西班牙语字符(比如重音符号和Ñ)
  3. 去掉单引号
  4. 最后,把空格替换成短横线,并把所有字母转换成小写。

我在一个简单的测试文件中成功实现了这些功能,但那个文件不是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)

撰写回答