在Windows7中通过命令行输入python2.7 utf-8
我是个新手,我相信过去也有人问过类似的问题,但我很难找到/理解答案。提前感谢您对我的耐心 因此,我试图编写一个脚本来读取utf-8编码的输入文件中的行,将其部分内容与用户传入的可选命令行参数进行比较,如果有匹配项,则在将其打印到输出文件之前对该行执行一些操作。我正在使用在Windows7中通过命令行输入python2.7 utf-8,python,windows-7,python-2.7,utf-8,command-line-arguments,Python,Windows 7,Python 2.7,Utf 8,Command Line Arguments,我是个新手,我相信过去也有人问过类似的问题,但我很难找到/理解答案。提前感谢您对我的耐心 因此,我试图编写一个脚本来读取utf-8编码的输入文件中的行,将其部分内容与用户传入的可选命令行参数进行比较,如果有匹配项,则在将其打印到输出文件之前对该行执行一些操作。我正在使用编解码器打开文件 我现在正在使用argparse模块解析命令行参数。文件中的行可以是各种语言,因此命令行参数也需要是utf-8 例如: 文件中的一行可能如下所示: r ax z.j j j.d ax1.ju t. 应从命令行调用脚
编解码器
打开文件
我现在正在使用argparse
模块解析命令行参数。文件中的行可以是各种语言,因此命令行参数也需要是utf-8
例如:
文件中的一行可能如下所示:
r ax z.j j j.d ax1.ju t.
应从命令行调用脚本,如下所示:
>python myscript.py mytextfile.txt-graphemeъ
这是我的代码中应该进行处理的部分。在本例中,orth
是一些西里尔文字,grapheme
是西里尔文字
def process_orth(orth, grapheme):
grapheme = grapheme.decode(sys.stdin.encoding).encode('utf-8')
if (grapheme in orth):
print 'success, your grapheme was: ' + grapheme.encode('utf-8')
return True
else:
print 'failure, your grapheme was: ' + grapheme.encode('utf-8')
return False
不幸的是,尽管grapheme确实存在,但函数返回false并打印问号而不是grapheme:
失败,您的图形名是:?
根据我读到的其他帖子的建议,我尝试在process_orh()
的开头添加以下内容,但似乎没有效果:
grapheme.decode(系统标准编码).encode('utf-8')
所以我的问题是…
如何通过命令行将utf-8字符串传递到python脚本中?另外,在Windows7上是否有任何额外的怪癖(安装cygwin是否会改变什么)?如果您使用
codecs.open()
打开输入文件,则您使用的是unicode数据,而不是编码数据。您只需要解码图形名
,而不是将其再次编码为UTF-8:
grapheme = grapheme.decode(sys.stdin.encoding)
if grapheme in orth:
print u'success, your grapheme was: ' + grapheme
return True
请注意,我们也打印unicode;通常,print
将确保为当前代码页重新编码Unicode值。这仍然可能失败,因为Windows控制台打印非常困难,请参阅
不幸的是,Windows上的sys.argv显然会被乱码,因为Python使用了一个不支持unicode的系统调用。有关支持unicode的替代方案,请参阅
我看不出
argparse
有任何Unicode输入问题的原因,但如果有问题,您可以始终从win32\u Unicode\u argv()
获取Unicode输出,并将其编码到UTF-8,然后再将其传递到argparse如果您使用编解码器打开输入文件。open()
则您有Unicode数据,非编码数据。您只需要解码图形名
,而不是将其再次编码为UTF-8:
grapheme = grapheme.decode(sys.stdin.encoding)
if grapheme in orth:
print u'success, your grapheme was: ' + grapheme
return True
请注意,我们也打印unicode;通常,print
将确保为当前代码页重新编码Unicode值。这仍然可能失败,因为Windows控制台打印非常困难,请参阅
不幸的是,Windows上的
sys.argv显然会被乱码,因为Python使用了一个不支持unicode的系统调用。有关支持unicode的替代方案,请参阅
我看不出
argparse
有任何Unicode输入问题的原因,但如果有问题,您可以始终从win32\u Unicode\u argv()
获取Unicode输出,并将其编码到UTF-8,然后将其传递到argparse
打印报告(ORH)
给我u'\u0440\u0430\u0437\u044a\u0435\u0434\u0430\u044e\u0442'
,和打印报告(字形)
给我打印报告(ORH)
给我u'\u0440\u0430\u0437\u044a\u0435\u0434\u0430\u044e\u0442'
,和打印报告(字形)
给了我“?”
谢谢你的回复。我刚刚试过(只是解码),但除了打印报告(grapheme)
现在给我u'?'
@KaleidoEscape:这是一个ascii问号;这就是传入的内容,或者您使用.decode(sys.stdin.encoding,'replace')
忽略未知字符。repr(sys.argv)
告诉您传入的Windows是什么?打印sys.stdin.encoding
告诉您什么是预期的编解码器?我没有使用.decode(sys.stdin.encoding,'replace')
,至少是有意识地,呵呵。我正在使用argparse
模块,也许它会这样做'repr(sys.argv)
告诉我['myscript.py'、'test.txt'、'-graph'、'?']
和print sys.stdin.encoding
说cp437
(当然,我在运行脚本时没有键入问号,我键入了ъKaleidoEscape:然后windows将'?
作为参数传入,我很害怕。@KaleidoEscape:看看有什么解决办法。谢谢你的回复。我刚刚试过(只是解码),但除了打印报告(grapheme)
现在给我u'?'
@KaleidoEscape:这是一个ascii问号;这就是传入的内容,或者您使用.decode(sys.stdin.encoding,'replace')
忽略未知字符。repr(sys.argv)
告诉您传入的Windows是什么?打印sys.stdin.encoding
告诉您什么是预期的编解码器?我没有使用.decode(sys.stdin.encoding,'replace')
,至少是有意识地,呵呵。我正在使用argparse
模块,也许它会这样做'repr(sys.argv)
告诉我['myscript.py'、'test.txt'、'-graph'、'?']
和print sys.stdin.encoding
说cp437
(当然,我在运行脚本时没有键入问号,我键入了ъ)。@KaleidoEscape:然后windows作为参数传入了'
。@KaleidoE