用python读取csv文件的列

时间:2011-07-30 17:18:26

标签: python csv

我正在使用python的CSV模块迭代列的行。

我需要做的是:

  1. 获取“title”列的第一行
  2. 删除所有西班牙语字符(重音符号,Ñ)
  3. 删除单引号
  4. 最后,用破折号替换空格并将所有内容转换为小写。
  5. 我使用了一个简单的测试文件,而不是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是一个词典。您可能希望在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转换为字符串。您需要找出要保留的数据。

另外,你的意思是列表理解吗?那么你应该使用方括号。