【问题标题】:Changing sys.stdin mode更改 sys.stdin 模式
【发布时间】:2013-03-28 15:15:02
【问题描述】:

如何更改打开stdin 的模式?具体来说,我们将 CSV 文件传送到 python 脚本以清理数据,但数据中的垂直制表符似乎需要处于通用换行符模式。

问题数据似乎是输入流中的一些\x0b 字符。

由 python 打印,在使用 'rU' 打开文件之一后

['P', 'B', '', '1 W Avene, #8\x0bMiami Beach, FL 33139']
['S', 'H', '\x0bElberon, NJ 07740', '9 E Avenue\x0bElberon, NJ 07740']
['C', 'W', 'E R A', '2 B 3rd Floor \x0bNew York NY 10023 ']
['D', 'M', '', '1 K Street, NW\x0bWashington, DC 20005']
['E', 'W', '', '5 P C Lane\x0bDenver, CO 80209-3311']

【问题讨论】:

  • \x0b 不是换行符。 rU 无济于事。
  • 'rU' 确实解决了使用内置 open() 打开其中一个 CSV 文件时的问题。编辑 Q 以正确引用 '\x0b'。
  • 嗯?您的输入中仍然有\x0b。那么这怎么可能是问题呢?为什么不显示有问题的文件的 hexdump 之类的?
  • 这是一个很好的问题,我没有答案。我只能告诉你,当 opening 与 'r' 时,csv 阅读器会抛出 "_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?",而当使用 'rU' 打开文件时,csv 阅读器的行为与预期相同。
  • 事实证明,问题在于文件使用'\r'(CR,又名“经典 mac”换行符)专门作为行终止符,而不是更常见的 LF 或 CRLF。与\x0b无关。

标签: python stdin sys


【解决方案1】:

您的问题是您正在阅读的 CSV 文件仅使用 CR (\r) 换行符;它与垂直标签无关。 Python 2.x 打开stdin 没有通用线路支持(以便二进制文件正常工作)。

作为一种解决方法,您可以尝试以下方法,假设您的输入相对较小:

csv.reader(sys.stdin.read().split('\r'))

【讨论】:

    【解决方案2】:

    根据PEP 278universal-newlines 是默认开启的。

    默认启用通用换行支持,但可以在配置 Python 时禁用。

    你有样本数据吗?

    【讨论】:

    • stdin 故意不使用通用换行方式打开,以便对二进制文件进行操作。
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多