【问题标题】:while reading last row in csv file Error: iterator should return strings, not bytes (did you open the file in text mode?)读取 csv 文件中的最后一行错误:迭代器应返回字符串,而不是字节(您是否以文本模式打开文件?)
【发布时间】:2021-03-21 00:05:18
【问题描述】:

我想读取最后一行温度(即 24.925)。我的数据格式如下.csv格式

Date                Temp            RH
2020-12-07 14:00:00 24.5198601667   66.9861108333
2020-12-07 15:00:00 24.9940271667   64.4736103333
2020-12-07 16:00:00 24.925          65

我正在关注给定的代码:

from collections import deque
import csv

def get_last_row(csv_filename):
    with open(csv_filename, 'rb') as f:
        return deque(csv.reader(f), 1)[0]

lastline = ', '.join(get_last_row('data.csv'))
values = lastline.split("\t")
print ((values[1]))

任何建议都会有所帮助。 提前谢谢你。

【问题讨论】:

  • “迭代器应该返回字符串,而不是字节(您是否以文本模式打开文件?)”有什么不清楚的地方?您是否尝试过按照错误消息提示以文本模式打开文件?
  • 我不明白用逗号加入然后用制表符拆分的目的。您的数据中没有任何选项卡。您的示例数据不是 CSV 格式 - 它真的是制表符分隔的文件吗?
  • 谢谢。我在 txt 中尝试过,但显示的是整行。我只想要温度值...
  • 如果“data.csv”真的是逗号分隔,那么最终温度将是get_last_row("data.csv")[1]。 CSV 模块会为您拆分列。不需要标签拆分部分。如果它是一个制表符分隔的文件,那么csv.reader(f, dialect=csv.excel_tab) 可能会起作用。但是您向我们展示的数据是某种数据的扩展视图——也许是您从显示 pandas 数据框获得的。你能发布实际的 CSV 文件内容吗?

标签: python csv


【解决方案1】:

这是一个分工问题。 CSV 模块不用于计算字符串编码。解码时,它将寻找字符串分隔符、引号和分隔符。由于字符串不会直接与字节进行比较,除非它们已被解码,因此模块无法继续。例如,CSV 查找单个字符分隔符,但 UTF-16 中的逗号是 2 个字节。解决方法:以文本模式打开。

我为这个例子所做的只是从 open 调用中删除 "rb"。这将以系统的默认编码打开文件。您可能需要指定一个编码,例如,open('data.csv', encoding='utf-8')

from collections import deque
import csv

def get_last_row(csv_filename):
    with open(csv_filename) as f:
        return deque(csv.reader(f), 1)[0]

lastline = ', '.join(get_last_row('data.csv'))
values = lastline.split("\t")
print ((values[1]))

注意:此代码不适用于您提供的示例,该示例实际上不是 CSV,并且由于它不包含选项卡,values[1] 是一个索引错误。

【讨论】:

  • 无论如何,我已经接受了你的第一个建议。我已将我的数据保存为 .txt 格式并更早地运行您建议的代码。有用...:)。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 2020-05-06
  • 1970-01-01
  • 2016-04-07
  • 2013-09-24
  • 2020-12-17
  • 2023-01-22
相关资源
最近更新 更多