天道酬勤,学无止境

在 Python 3 中以字节形式访问 sys.argv [重复](Access sys.argv as bytes in Python 3 [duplicate])

问题

正如标题所说,python 3 中是否有sys.argv等效项允许我将参数读取为字节?

我想要这个的原因是,我有一个脚本,它接受一个字节 (\xe9\x88...) 作为它的第一个 arg,第一个 arg 应该是从 utf8 字符串转换的字节,sys.argv 将尝试使用某些编码解码第一个 arg,可能不是 utf8,因此程序可能会失败。 如果我可以在不调用 sys.argv 的情况下访问 args,转换将不会完成。

回答1

Python 错误跟踪器上有一个关于此的问题:

在某些情况下,命令行的编码不正确或未知。 sys.argv 是用文件系统编码解码的,这可能是错误的。 例如。 请参阅问题 #4388(好吧,这是一个错误,应该修复)。

作为 os.environb,拥有 sys.argv 的字节版本可以决定用于解码每个参数的编码,或者如果我们不关心编码,则操作字节会很有用。

由于在 Python 3 上sys.argv是使用文件系统编码进行编码的,因此针对该错误的建议解决方案是使用 os.fsencode:

argvb = list(map(os.fsencode, sys.argv))

os.fsencode使用 PEP-383 中定义的surrogateescape编码使用字符串对字符串进行编码。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • UnicodeDecodeError,无效的继续字节(UnicodeDecodeError, invalid continuation byte)
    问题 为什么以下项目失败? 为什么用“ latin-1”编解码器成功? o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving v = o.decode("utf-8") 结果是: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte 回答1 在二进制文件中,0xE9看起来像1110 1001 。 如果您在Wikipedia上读到有关UTF-8的信息,那么您会看到,这样的字节后必须是两个,格式为10xx xxxx 。 因此,例如: >>> b'\xe9\x80\x80'.decode('utf-8') u'\u9000' 但这仅仅是造成异常的机械原因。 在这种情况下
  • 如何在命令行中以浮点数形式读取?(How to read in a command line as floats?)
    问题 如何在命令行中以浮点数或整数形式读取? test.py 11 22.4 11.7 99.9 69 我试过了: numbersList = float(sys.argv[1:len(sys.argv)]) 回答1 import sys args = map(float, sys.argv[1:]) 或者,如果您更喜欢列表理解: args = [float(x) for x in sys.argv[1:]] 回答2 要迭代您的列表,请尝试: numbersList = [float(sys.argv[i]) for i in range(1, len(sys.argv))] 回答3 如果仅以数字形式读取信息很重要并且不需要区分整数和浮点数,则可以尝试这样的操作 import sys print sum(map(float, sys.argv[1:])) 回答4 一个更高层次的解决方案,直接使用argparse而不是sys.argv : import argparse p = argparse.ArgumentParser() p.add_argument('values', nargs="*", type=float) args = p.parse_args() numbersList = args.values
  • 手把手教你用python打造redis扫描器,支持多线程批量扫描
    Table of Contents 预备知识 一、大端模式与小端模式 二、IP地址的不同表现形式 1.字符串表现形式 2.整数表现形式 3.大小端模式下的IP地址 三、Python的socket库 1.socket.socket(family,type) 2.socket.connect(address) 3.socket.connect_ex(address) 4.socket.settimeout(value) 5.socket.sendall(data) 6.socket.recv(bufsize) 7.socket.close() 四、Python的sys库 五、Redis服务特征识别 1.PING命令 2.AUTH命令 代码编写 六、编程实现Redis服务识别 七、密码字典爆破 优化 八、批量扫描同一网段下的主机 九、多线程扫描,加快速度!!! 预备知识 一、大端模式与小端模式 在内存中,数据的表示模式分为两种:大端模式和小端模式。 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。 在小端模式表示法下
  • 如何在Python中将整个列表作为命令行参数传递?(How to pass an entire list as command line argument in Python?)
    问题 我试图将包含整数的两个列表作为参数传递给python代码。 但是sys.argv[i]以字符串列表的形式获取参数。 输入看起来像, $ python filename.py [2,3,4,5] [1,2,3,4] 我发现以下黑客可以转换列表。 strA = sys.argv[1].replace('[', ' ').replace(']', ' ').replace(',', ' ').split() strB = sys.argv[2].replace('[', ' ').replace(']', ' ').replace(',', ' ').split() A = [float(i) for i in strA] B = [float (i) for i in strB] 有一个更好的方法吗? 回答1 命令行参数始终以字符串形式传递。 您将需要自己将它们解析为所需的数据类型。 >>> input = "[2,3,4,5]" >>> map(float, input.strip('[]').split(',')) [2.0, 3.0, 4.0, 5.0] >>> A = map(float, input.strip('[]').split(',')) >>> print(A, type(A)) ([2.0, 3.0, 4.0, 5.0], <type 'list'>)
  • 使用 python 3 以健壮的方式解析文件(Parse file in robust way with python 3)
    问题 我有一个需要逐行查看的日志文件,显然它包含一些“坏字节”。 我收到以下几行的错误消息: UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 9 中的字节 0xb0:起始字节无效 我已经能够将问题简化为包含以下行的文件“log.test”: Message: \260 (至少这是它在我的 Emacs 中的显示方式。) 我有一个文件“demo_error.py”,它看起来像这样: import sys with open(sys.argv[1], 'r') as lf: for i, l in enumerate(lf): print(i, l.strip()) 然后我从命令行运行: $ python3 demo_error.py log.test 完整的回溯是: Traceback (most recent call last): File "demo_error.py", line 5, in <module> for i, l in enumerate(lf): File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 313, in decode (result, consumed) =
  • sys.argv [1],IndexError:列表索引超出范围[重复](sys.argv[1], IndexError: list index out of range [duplicate])
    问题 这个问题已经在这里有了答案: 使用sys.argv [1]时“列表索引超出范围” (1个答案) 3年前关闭。 我在以下Python代码部分遇到了问题: # Open/Create the output file with open(sys.argv[1] + '/Concatenated.csv', 'w+') as outfile: try: with open(sys.argv[1] + '/MatrixHeader.csv') as headerfile: for line in headerfile: outfile.write(line + '\n') except: print 'No Header File' 具体来说,错误如下: Traceback (most recent call last): File "ConcatenateFiles.py", line 12, in <module> with open(sys.argv[1] + 'Concatenated.csv', 'w+') as outfile: IndexError: list index out of range 我已经进行了一些研究,似乎sys.argv在运行脚本时可能在命令行上需要一个参数,但是我不确定要添加什么或可能是什么问题! 我也搜索了该站点,但是我发现的所有解决方案都没有评论
  • 将命令行输入解码为 Unicode Python 2.7 脚本的最佳方法(Best way to decode command line inputs to Unicode Python 2.7 scripts)
    问题 我所有的脚本都使用 Unicode 文字, from __future__ import unicode_literals 但是当有可能使用字节串调用函数时,这会产生问题,我想知道处理这个问题并产生明显有用的错误的最佳方法是什么。 我认为我采用的一种常见方法是在它发生时简单地说明这一点,例如 def my_func(somearg): """The 'somearg' argument must be Unicode.""" if not isinstance(arg, unicode): raise TypeError("Parameter 'somearg' should be a Unicode") # ... 对于需要是 Unicode(并且可能是字节串)的所有参数。 但是,即使我这样做,如果提供的参数对应于这些参数,我的argparse命令行脚本也会遇到问题,我想知道这里的最佳方法是什么。 似乎我可以简单地检查这些参数的编码,并使用该编码对它们进行解码,例如 if __name__ == '__main__': parser = argparse.ArgumentParser(...) parser.add_argument('somearg', ...) # ... args = parser.parse_args() some_arg = args
  • 如何在Python中访问命令行参数?(How do I access command line arguments in Python?)
    问题 我使用python创建我的项目设置设置,但我需要获取命令行参数的帮助。 我在终端上尝试了这个: $python myfile.py var1 var2 var3 在我的Python文件中,我想使用所有输入的变量。 回答1 Python教程对此进行了解释: import sys print(sys.argv) 更具体地说,如果您运行python example.py one two three : >>> import sys >>> print(sys.argv) ['example.py', 'one', 'two', 'three'] 回答2 import sys sys.argv[1:] 将为您提供参数列表(不包括python文件的名称) 回答3 我强烈建议Python 2.7及更高版本随附的argparse。 argparse模块减少了样板代码,并使代码更加健壮,因为该模块可以处理所有标准用例(包括子命令),为您生成帮助和用法,检查并清理用户输入-您需要担心的所有问题您正在使用sys.argv方法。 它是免费的(内置)。 这里有个小例子: import argparse parser = argparse.ArgumentParser("simple_example") parser.add_argument("counter", help="An integer
  • 在Windows下使用python修改文件创建/访问/写入时间戳(Modify file create / access / write timestamp with python under windows)
    问题 我试图找到一种使用python在Windows下修改文件时间戳的简单方法,但是网络上没有太多清晰的信息。 经过一会儿搜索,我找到了解决方案。 为了缩短对其他人的搜索,代码如下。 也许可以更轻松,更漂亮地完成此操作,但是它可以工作。 我唯一没有解决的是夏令时间-冬令时间问题,即如果给出了夏令时,则结果相差一小时。 也许有人可以添加更正? from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING from pywintypes import Time import time import sys import os if len(sys.argv)<5: pfile = os.path.basename(sys.argv[0]) print "USAGE:\n\t%s <createTime> <modifyTime> <accessTime> <FileName>\n" % pfile print "EXAMPLE:" print '%s "01.01.2000 00:00:00" "01.01.2000 00:00:00" "01.01.2000 00:00:00
  • 使用Python请求模块下载并保存PDF文件(Download and save PDF file with Python requests module)
    问题 我正在尝试从网站下载PDF文件并将其保存到磁盘。 我的尝试因编码错误而失败,或者导致PDF空白。 In [1]: import requests In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' In [3]: response = requests.get(url) In [4]: with open('/tmp/metadata.pdf', 'wb') as f: ...: f.write(response.text) --------------------------------------------------------------------------- UnicodeEncodeError Traceback (most recent call last) <ipython-input-4-4be915a4f032> in <module>() 1 with open('/tmp/metadata.pdf', 'wb') as f: ----> 2 f.write(response.text) 3 UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14
  • Access sys.argv as bytes in Python 3 [duplicate]
    This question already has answers here: sys.argv as bytes in Python 3k (2 answers) Closed 2 years ago. As the title said, is there a sys.argv equivalent in python 3 allow me to read arguments as bytes? The reason I want this is, I have a script which accept a bytes (\xe9\x88...) as its first arg, the first arg is supposed to be a bytes converted from an utf8 string, sys.argv will try to decode the first arg using some encoding, which may not utf8, so the program may fail. If I can access the args without calling sys.argv, the conversion will not be done.
  • 使用Python 3从Twitter API检索请求令牌(Retrieving a Request Token from the Twitter API with Python 3)
    问题 我正在尝试使用Python 3与Twitter API进行接口,以返回页面的链接,该页面为我提供了用于请求访问令牌的密码。 如此处详细说明:https://dev.twitter.com/docs/auth/pin-based-authorization Twitter的API响应我,告诉我我没有通过返回401来正确授权我的POST请求。关于我为什么不对base64中的HMAC签名进行正确编码,我有一个最好的猜测。 根据我查看过的正确POST请求的样本,我生成的POST请求的其他所有部分均显示为正确。 我花了几天的时间进行这项工作,希望有人可以帮助我超越最后一部分。 这是Twitter API文档中最相关的部分:https://dev.twitter.com/docs/api/1/post/oauth/request_token https://dev.twitter.com/docs/auth/authorizing-request 这是我正在使用的代码: import urllib.parse, urllib.request, json from hashlib import sha1 import hmac import binascii import time import random import sys #Server Links REQUEST_URL =
  • sys.argv [1]在脚本中的含义(sys.argv[1] meaning in script)
    问题 我目前正在自学Python,只是想以简化的方式(参考下面的示例)想知道sys.argv[1]代表什么。 它只是在要求输入吗? #!/usr/bin/python3.1 # import modules used here -- sys is a very standard one import sys # Gather our code in a main() function def main(): print ('Hello there', sys.argv[1]) # Command line args are in sys.argv[1], sys.argv[2] .. # sys.argv[0] is the script name itself and can be ignored # Standard boilerplate to call the main() function to begin # the program. if __name__ == '__main__': main() 回答1 我想指出,先前的答案对用户的知识做出了许多假设。 该答案尝试在更多教程级别回答问题。 对于Python的每次调用, sys.argv都会自动是一个字符串列表,这些字符串表示命令行上的参数(以空格分隔)。 该名称来自C编程约定,其中argv和argc代表命令行参数。
  • 如何从Unix / Linux上的文件中获取任意块(How to grab an arbitrary chunk from a file on unix/linux [duplicate])
    问题 这个问题已经在这里有了答案: 如何从文件中提取单个字节块? (5个答案) 3年前关闭。 我正在尝试将一个二进制文件中的一个块复制到一个新文件中。 我有要获取的块的字节偏移量和长度。 我尝试使用dd实用程序,但这似乎是读取并丢弃直到偏移量的数据,而不是仅仅查找(我想是因为dd用于复制/转换数据块)。 这使它相当慢(并且偏移量越高,速度越慢。这是我尝试的命令: dd if=inputfile ibs=1 skip=$offset count=$datalength of=outputfile 我想我可以写一个小的perl / python /任何脚本来打开文件,寻找偏移量,然后按块读取和写入所需的数据量。 是否有支持此类功能的实用程序? 回答1 是的,今天用dd这样做很尴尬。 我们正在考虑在coreutils中向dd添加skip_bytes和count_bytes参数以提供帮助。 但是,下面的方法应该起作用: #!/bin/sh bs=100000 infile=$1 skip=$2 length=$3 ( dd bs=1 skip=$skip count=0 dd bs=$bs count=$(($length / $bs)) dd bs=$(($length % $bs)) count=1 ) < "$infile" 回答2 您可以使用tail -c+N修剪输入中的前N个字节
  • 日文邮件主题编码(japanese email subject encoding)
    问题 显然,对日语电子邮件进行编码有点挑战性,我自己也在慢慢发现这一点。 如果有任何专家(即使是那些经验有限的人也会这样做),我能否提供一些关于如何做、如何测试和如何验证的指导? 请记住,我从未涉足过日本附近的任何地方,只是我正在开发的产品在那里等地使用。 到目前为止我所知道的(我认为)如下: - 日语电子邮件应使用 ISO-2022-JP、日语 JIS 代码页 50220 或 SHIFT_JIS 代码页 932 进行编码 - 电子邮件传输编码应设置为 Base64(纯文本)和 7Bit(Html) - 电子邮件主题应单独编码,以“=?ISO-2022-JP?B?”开头 (不知道这是什么意思)。 我试过用 "=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject)) 它基本上按预期提供了编码字符串,但它不会在电子邮件程序中显示为任何日语文本 - 我已经在 Outlook 2003、Outlook Express 和 GMail 中进行了测试 任何帮助将不胜感激 好的,所以要发布一个简短的更新,感谢两个有用的答案,我设法获得了正确的格式和编码.现在,Outlook给出了类似于正确主题的东西: =?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。
  • Python字符串解码问题(Python string decoding issue)
    问题 我正在尝试解析一个CSV文件,其中包含一些数据,大部分是数字,但带有一些字符串-我不知道它们的编码,但是我知道它们在希伯来语中。 最终,我需要了解编码,以便可以对字符串进行统一编码,打印它们,然后稍后再将它们放入数据库中。 我尝试使用Chardet,它声称字符串是Windows-1255( cp1255 ),但是尝试print someString.decode('cp1255')产生臭名昭著的错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128) 我尝试了所有其他可能的编码,但均无济于事。 另外,该文件绝对有效,因为我可以在Excel中打开CSV并看到正确的数据。 知道如何正确解码这些字符串吗? 编辑:这是一个例子。 其中一个字符串如下所示(希伯来语字母的前五个字母): print repr(sampleString) #prints: '\xe0\xe1\xe2\xe3\xe4' (使用Python 2.6.2) 回答1 这是正在发生的事情: sampleString是一个字节字符串(经cp1255编码) sampleString.decode("cp1255")将字节字符串解码(解码== sampleString
  • 查找当前目录和文件目录[重复](Find current directory and file's directory [duplicate])
    问题 这个问题已经在这里有了答案: 您如何正确确定当前脚本目录? (14个回答) 如何在Python Shell中知道/更改当前目录? (7个答案) 3年前关闭。 在Python中,我可以使用哪些命令来查找: 当前目录(运行Python脚本时我在终端中的位置),以及我正在执行的文件在哪里? 回答1 要获取包含Python文件的目录的完整路径,请在该文件中写入以下内容: import os dir_path = os.path.dirname(os.path.realpath(__file__)) (请注意,如果您已经使用os.chdir()更改了当前工作目录,则上述方法将不起作用,因为__file__常量的值是相对于当前工作目录的,并且不会被os.chdir()更改os.chdir()调用。) 要获取当前的工作目录,请使用 import os cwd = os.getcwd() 上面使用的模块,常量和函数的文档参考: os和os.path模块。 __file__常量 os.path.realpath(path)(返回“指定文件名的规范路径,消除该路径中遇到的任何符号链接” ) os.path.dirname(path)(返回“路径名path的目录名” ) os.getcwd()(返回“表示当前工作目录的字符串” ) os.chdir(path)( “将当前工作目录更改为path ”
  • 读取二进制文件并遍历每个字节(Reading binary file and looping over each byte)
    问题 在Python中,如何读取二进制文件并在该文件的每个字节上循环? 回答1 Python 2.4及更早版本 f = open("myfile", "rb") try: byte = f.read(1) while byte != "": # Do stuff with byte. byte = f.read(1) finally: f.close() 的Python 2.5-2.7 with open("myfile", "rb") as f: byte = f.read(1) while byte != "": # Do stuff with byte. byte = f.read(1) 请注意,with语句在2.5以下的Python版本中不可用。 要在v 2.5中使用它,您需要将其导入: from __future__ import with_statement 在2.6中,这是不需要的。 的Python 3 在Python 3中,这有点不同。 我们将不再以字节模式而是字节对象从流中获取原始字符,因此我们需要更改条件: with open("myfile", "rb") as f: byte = f.read(1) while byte != b"": # Do stuff with byte. byte = f.read(1) 或如benhoyt所说,跳过不等于并利用b"
  • 实现简单 FSM 的 Pythonic 方法是什么?(What is the Pythonic way to implement a simple FSM?)
    问题 昨天我不得不解析一个非常简单的二进制数据文件 - 规则是,在一行中查找两个都是 0xAA 的字节,然后下一个字节将是一个长度字节,然后跳过 9 个字节并从那里。 重复到文件末尾。 我的解决方案确实有效,并且很快就可以组合起来(尽管我本质上是一个 C 程序员,但我仍然认为用 Python 编写它比用 C 编写它要快)-但是,很明显根本不是 Pythonic,它读起来像一个 C 程序(而且不是一个很好的程序!) 对此有什么更好/更 Pythonic 的方法? 像这样的简单 FSM 仍然是 Python 中的正确选择吗? 我的解决方案: #! /usr/bin/python import sys f = open(sys.argv[1], "rb") state = 0 if f: for byte in f.read(): a = ord(byte) if state == 0: if a == 0xAA: state = 1 elif state == 1: if a == 0xAA: state = 2 else: state = 0 elif state == 2: count = a; skip = 9 state = 3 elif state == 3: skip = skip -1 if skip == 0: state = 4 elif state == 4
  • Python对Linux系统的操作,打开文件与读写文件,python模拟linux的cp操作
    cp操作请跳到第10节 1.open内建打开文件函数 作为打开文件的“钥匙”,内建函数open()提供了初始化输入/输出(I/O)操作的通用结接口 成功打开文件后会返回一个文件对象,如果打开失败会引发一个错误 示例: file_object = open(file_name,mode='r') file_object 是python的变量名用来保存文件对象 mode是打开的方式,以读或者写或其他方式打开。以读打开就只能对文件进行读操作而不能进行写操作 mode模式: 1.5 close关闭文件 文件被打开后会自动丢进堆栈,如果是一个较大的文件有必要在使用后关闭 file_object.close 关闭文件 2.read文件输入函数 read()方法用来直接读取字节到字符串中,最多读取给定数目个字节,如果没有给定size参数(默认值为-1)或者sieze为负,文件将被读取直至末尾。 示例: data=file_object.read() print(data) 3.readline方法 读取打开文件的一行(读取下个行结束符之前的所有字节),包括行结束符,作为字符串返回 readline也有一个可选的size参数,默认为-1,代表读至行结束符,如一行10个字符,size=5,则读一行的前5个字符 示例: data=file_object.readline() print(data) 4