【问题标题】:python-cant read from all rows from a csvpython-cant从csv中读取所有行
【发布时间】:2016-08-02 02:46:00
【问题描述】:

我正在尝试从如下所示的 CSV 文件中读取“成绩单文本”列 -

Order,LearningID,Gender,Race,College,  ID ,B,Transcript Text
1,T66666666B,Male,UNKNOWN,AMC,122333444,,(BEGIN INTERVIEW)
6,T77777777B,Male,UNKNOWN,AMC,133333333,,INTERVIEWER:  CTVA's your major?
7,T88888888B,Male,UNKNOWN,AMC,144444444,,"STUDENT:  Yes, that's right."

我的代码读取列号。 7(成绩单文本)看起来像这样 -

import csv       

file_csv = open("test.csv", newline='')
csv_reader = csv.reader(file_csv, delimiter=',', quotechar='|')
txt_string =''

common_words = ['mmhmm', 'interposing', 'xblank']

for i, v in enumerate(csv_reader):
    print (i)
    print(v[7])
    txt_string += v[7]

file_csv.close()

现在当我遍历这个时,它会跳过一些值,而不是打印 v[7](column - transcript text) 的所有值。奇怪的是,计数器值也不会被打印出来。

输出看起来像这样 -

0
Transcript Text
3
STUDENT:  Yes, that's right.

我已确保使用 utf-8 选项 MS Excel 保存 csv,我也尝试将编码设置为 utf-8。

file_csv = open("test.csv", newline='', encoding ='utf-8')

但是没有任何效果。而且非常奇怪的是,每次我运行它时,结果都是不稳定的,即打印了一些以前没有打印的行。

这可能是什么问题? (使用 Python 3.5,我使用的实际 csv 文件大约有 25k 行。

【问题讨论】:

  • 你使用的是什么操作系统?
  • 你能显示你的 csv 文件的前 2-3 行吗?

标签: python excel csv encoding utf


【解决方案1】:

将您的代码更改为以下内容,

with open(file) as f:
    reader = csv.reader(f)
    next(reader) # skip the header row
    for i, row in reader:
        print(i)
        print(row[7])

如果这有效。

【讨论】:

    【解决方案2】:

    您的 quotechar 是双引号 "
    另外,从python3开始你应该使用这种文件处理方式,试试吧:

    text = ''
    with open('test.csv', newline='') as csvfile:
    csvFile = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row,data in enumerate(csvFile):
        print(row, data[7])
        text += data[7]
    
    print(text)
    

    输出:

    0 Transcript Text
    1 (BEGIN INTERVIEW)
    2 INTERVIEWER:  CTVA's your major?
    3 STUDENT:  Yes, that's right.
    Transcript Text(BEGIN INTERVIEW)INTERVIEWER:  CTVA's your major?STUDENT:  Yes, that's right.
    

    【讨论】:

      【解决方案3】:

      这是 Python2,但值得一试,看看它是否能解决您的问题

      我看到的第一个问题是您给出的引号字符为 |,但看起来您的引号字符应该是 ",因为第 8 列(转录文本)包含在 " 中,而不是 @987654324 @。

      另外,我喜欢阅读第一行(当存在列标题时)并使用 zip 创建列数据字典,而不是按索引访问(当列更改顺序时可能会出错)

      import csv
      
      file_csv = open("so.csv")
      csv_reader = csv.reader(file_csv, delimiter=',', quotechar='"')
      conversation = []
      
      common_words = ['mmhmm', 'interposing', 'xblank']
      
      headers = [header.replace(" ", "_").lower() for header in csv_reader.next()]
      for data in csv_reader:
          columns = dict(zip(headers, data))
          conversation.append(columns["transcript_text"])
      
      file_csv.close()
      
      for i, item in enumerate(conversation):
          print(i, item)
      

      【讨论】:

      • 这行得通,但我想在我的代码中使用索引,因为我想根据某个列中的值过滤掉某些行。例如。 - 如果 v[3] = foo 然后将 v[7] 添加到字符串。同样更正quotechar 并没有更正python 3中的问题。输出现在是这样的 - 对于输入“他们是”,输出是“他们\ x92re”。这意味着它正在通过您的代码隐式转换为 utf。
      【解决方案4】:

      从表面上看,您似乎使用了错误的引号字符。来自csv docs

      指示 writer 对象仅引用这些字段 其中包含特殊字符,例如分隔符、引号字符或任何 lineterminator 中的字符数。

      由于某种原因,您将管道字符作为引号字符传递。但很明显,您提供的数据使用了双引号字符,这是默认字符,并且看起来工作得很好:

      >>> import csv, StringIO
      >>> data = """Order,LearningID,Gender,Race,College,  ID ,B,Transcript Text
      ... 1,T66666666B,Male,UNKNOWN,AMC,122333444,,(BEGIN INTERVIEW)
      ... 6,T77777777B,Male,UNKNOWN,AMC,133333333,,INTERVIEWER:  CTVA's your major?
      ... 7,T88888888B,Male,UNKNOWN,AMC,144444444,,"STUDENT:  Yes, that's right."
      ... """
      >>> fd = StringIO.StringIO(data)
      >>> print list(csv.reader(fd))
      [['Order', 'LearningID', 'Gender', 'Race', 'College', '  ID ', 'B', 'Transcript Text'], ['1', 'T66666666B', 'Male', 'UNKNOWN', 'AMC', '122333444', '', '(BEGIN INTERVIEW)'], ['6', 'T77777777B', 'Male', 'UNKNOWN', 'AMC', '133333333', '', "INTERVIEWER:  CTVA's your major?"], ['7', 'T88888888B', 'Male', 'UNKNOWN', 'AMC', '144444444', '', "STUDENT:  Yes, that's right."]]
      

      【讨论】:

        猜你喜欢
        • 2016-12-15
        • 2018-02-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多