如何从标准输入读取输入并强制编码?

2024-03-25

目标是不断地阅读stdin并强制执行utf8在Python2和Python3中。

我尝试过以下解决方案:

  • 以与 python2 和 python3 兼容的方式将字节写入标准输出 https://stackoverflow.com/questions/23932332/writing-bytes-to-standard-output-in-a-way-compatible-with-both-python2-and-pyth/23932488#23932488
  • Python 3:如何指定标准输入编码 https://stackoverflow.com/questions/16549332/python-3-how-to-specify-stdin-encoding/16549381#16549381

我试过了:

#!/usr/bin/env python

from __future__ import print_function, unicode_literals
import io
import sys

# Supports Python2 read from stdin and Python3 read from stdin.buffer
# https://stackoverflow.com/a/23932488/610569
user_input = getattr(sys.stdin, 'buffer', sys.stdin)


# Enforcing utf-8 in Python3
# https://stackoverflow.com/a/16549381/610569
with io.TextIOWrapper(user_input, encoding='utf-8') as fin:
    for line in fin:
        # Reads the input line by line
        # and do something, for e.g. just print line.
        print(line)

该代码在 Python3 中工作,但在 Python2 中,TextIOWrapper 没有读取函数,它会抛出:

Traceback (most recent call last):
  File "testfin.py", line 12, in <module>
    with io.TextIOWrapper(user_input, encoding='utf-8') as fin:
AttributeError: 'file' object has no attribute 'readable'

那是因为在 Python 中user_input , i.e. sys.stdin.buffer is an _io.BufferedReader对象及其属性有readable:

<class '_io.BufferedReader'>

['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_dealloc_warn', '_finalizing', 'close', 'closed', 'detach', 'fileno', 'flush', 'isatty', 'mode', 'name', 'peek', 'raw', 'read', 'read1', 'readable', 'readinto', 'readinto1', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']

而在Python2中user_input是一个文件对象,它的属性没有readable:

<type 'file'>

['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

如果你不需要一个完整的io.TextIOWrapper,但只是一个用于读取的解码流,您可以使用codecs.getreader()创建解码包装器:

reader = codecs.getreader('utf8')(user_input)
for line in reader:
    # do whatever you need...
    print(line)

codecs.getreader('utf8')为一个创建一个工厂codecs.StreamReader,然后使用原始流实例化。 我不确定StreamReader支持with上下文,但这可能不是绝对必要的(我想在阅读后不需要关闭 STDIN...)。

我已经在底层流仅提供非常有限的接口的情况下成功地使用了此解决方案。

更新(第二版)

从评论中可以看出,您实际上需要一个io.TextIOWrapper在交互模式下有适当的行缓冲等;codecs.StreamReader仅适用于管道输入等。

Using 这个答案 https://stackoverflow.com/a/13189316/1698431,我能够使交互式输入正常工作:

#!/usr/bin/env python
# coding: utf8

from __future__ import print_function, unicode_literals
import io
import sys

user_input = getattr(sys.stdin, 'buffer', sys.stdin)

with io.open(user_input.fileno(), encoding='utf8') as f:
    for line in f:
        # do whatever you need...
        print(line)

这创建了一个io.TextIOWrapper来自二进制 STDIN 缓冲区的强制编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从标准输入读取输入并强制编码? 的相关文章

随机推荐

  • 反转 Map 最简洁的 Scala 方法是什么?

    反转 Map 最简洁的 Scala 方法是什么 映射可能包含非唯一值 EDIT 的逆转Map A B 应该给Map B Set A 或者 MultiMap 那就更好了 如果您可能丢失重复的密钥 scala gt val map Map 1
  • 如何使用代理设置部署 Angular 应用程序

    我有一个代理配置文件 其中有 API 网络服务 链接到目标以调用我们的数据库 此代理配置在本地使用正常工作npm 启动 现在我需要将此应用程序部署到 IIS 上的生产 Windows 服务器 我用了ng build and ng 构建 pr
  • 如何使用 CruiseControl.Net 构建忽略可执行文件的输出?

    我正在运行一个名为 fart exe 的小型查找和替换实用程序 是的 是放屁 如 查找和替换文本 中所示 作为我的 CC 构建的一部分 效果很好 问题是 FART 在工作时会显示一个由管道 破折号 斜线组成的小 ASCII 旋转器 没有办法
  • LINQ Join On Between 子句

    我在组合 LINQ 查询 将根据邮政编码连接表 时遇到一些问题 我需要根据客户的邮政编码是否位于由 ZIPBEG 和 ZIPEND 列确定的邮政编码范围内来加入表 T SQL 看起来像这样 JOIN ZipCodeTable zips ON
  • Angular 2 和浏览器自动填充

    我正在使用 Angular 反应式表单实现登录页面 如果表单无效 登录 按钮将被禁用 import Component OnInit from angular core import FormBuilder FormGroup Valida
  • C++“重载”if() 语句

    是否有可能改变if 以便 class Foo int x Foo foo if foo 仅当价值x是不是零的东西 或者 到 int 的显式用户定义类型转换是否有效 这是一种合适的方法吗 或者 最好做类似的事情if foo getX 您可以通
  • PIL 图像到 QPixmap 转换问题

    今天我一直在努力应对这一挑战 我已经利用之前的帖子和其他资源成功地获得了很好的观点 我正在尝试将 PIL Image 转换为 QPixmap 以便可以在 PyQT GUI 上使用 QgraphicsScene 进行显示 但是当图片显示时颜色
  • 异常和SQLException之间的区别

    有人可以解释一下捕捉和捕捉之间的区别吗 Exception并抓住一个SQLException 我知道如果你选择打印异常错误 SQLException会打印出更多信息 但是还有其他的吗 try code catch Exception ex
  • 如何使用 Android MediaCodec 生成 AAC ADTS 基本流

    我正在尝试做的事情 使用 Android 的 MediaCodec 将原始 PCM 音频样本编码为原始 AAC 文件 我遇到的问题是 当我使用 FFMPEG 将生成的原始 AAC 文件打包到 M4A 容器中时 FFMPEG 抱怨文件中缺少编
  • 无法在 Samsung 上将数据库从版本“n”降级到“n-1”

    我有一个带有数据库的应用程序 使用标准 SQLiteOpenHelper 创建和打开 每当我升级数据库版本时 我也会升级应用程序的版本代码 因此数据库没有办法下降 数据库版本号总是增加 从不减少 我通过设置禁用了应用程序中的数据库备份and
  • PHP:=0D、=A20 符号

    从电子邮件正文获取信息后 我有很多符号 例如 0D A20 等 我该如何删除它们 我不想使用 body str replace A20 body 因为如果电子邮件正文确实包含该内容 它将被替换 有任何想法吗 谢谢 不要将它们替换为空 这些字
  • 在导航回 UINavigationController 堆栈中的上一个控制器之前向用户提示 UIAlertView

    我试图在导航到前一个控制器之前提示 UIAlertView 并在用户决定留在同一视图控制器上时阻止导航 使用CCT后退按钮操作助手 https github com weipin CCTBackButtonAction UIAlertVie
  • 翻转列表/元组的Pythonic方法[重复]

    这个问题在这里已经有答案了 翻转 列表 元组的最Python方式是什么 我所说的翻转的意思是 如果你有一个元组的元组 你可以使用像 tuple a b 这样的语法 翻转 它 这样你就可以执行 tuple b a 来获得相同的结果物品 一个例
  • TensorFlow - 显示会话中的所有变量

    我玩过一点 import tensorflow as tf x tf Variable 1 0 2 0 initializer tf global variables initializer session run initializer
  • ARM NEON:如何实现 256 字节查找表

    我正在使用内联汇编将我编写的一些代码移植到 NEON 我需要的一件事是将范围 0 128 的字节值转换为表中采用完整范围 0 255 的其他字节值 该表很短 但其背后的数学并不容易 因此我认为不值得每次 即时 计算它 所以我想尝试查找表 我
  • 如何在 tkinter 中获取条目的值?

    我正在尝试使用 Tkinter 的 Entry 小部件 我无法让它做一些非常基本的事情 返回输入的值 有谁知道为什么这么简单的脚本不会返回任何内容 我尝试了很多组合并研究了不同的想法 该脚本运行但不打印该条目 from Tkinter im
  • WPF C# 列表框外部滚动按钮

    您好 有一个列表框 我想要外部按钮来滚动列表框 我怎样才能实现这个目标 感谢您的帮助和示例 添加按钮点击处理程序 private void buttonUp Click object sender RoutedEventArgs e if
  • 干扰者:日记示例

    我对关于日志记录步骤的最常见 或推荐 disruptor 实现感到好奇 我最常见的问题是 它是如何实际实现的 通过示例 使用 JPA 明智吗 常用的数据库是什么 已经使用disruptor实施项目的社区 在中间处理程序 EventProce
  • Amazon S3 避免覆盖同名的对象

    如果我将文件上传到 S3 其文件名与存储桶中对象的文件名相同 则会覆盖该文件 有哪些选项可以避免覆盖具有相同文件名的文件 我在存储桶中启用了版本控制 认为这可以解决问题 但对象仍然被覆盖 我上面的评论不起作用 我以为WRITEACL 也适用
  • 如何从标准输入读取输入并强制编码?

    目标是不断地阅读stdin并强制执行utf8在Python2和Python3中 我尝试过以下解决方案 以与 python2 和 python3 兼容的方式将字节写入标准输出 https stackoverflow com questions