我已阅读XML电子邮件附件
bytes_string=part.get_payload(decode=False)
Run Code Online (Sandbox Code Playgroud)
有效负载以字节字符串形式出现,正如我的变量名所示.
我试图使用推荐的Python 3方法将此字符串转换为可以操作的可用字符串.
该示例显示:
Run Code Online (Sandbox Code Playgroud)str(b'abc','utf-8')
如何将b
(bytes)关键字参数应用于我的变量bytes_string
并使用推荐的方法?
我尝试的方式不起作用:
str(bbytes_string, 'utf-8')
Run Code Online (Sandbox Code Playgroud) 我想运行Linux字数统计实用程序wc来确定当前在/ var/log/syslog中的行数,因此我可以检测到它正在增长.我尝试了各种测试,当我从wc获得结果时,它既包括行数也包括命令(例如,var/log/syslog).
所以它返回:1338/var/log/syslog但我只想要行数,所以我想剥离/ var/log/syslog部分,并保持1338.
我已经尝试将它从bytestring转换为字符串,然后剥离结果,但没有快乐.转换为字符串和剥离,解码等的相同故事 - 都无法产生我正在寻找的输出.
这些是我得到的一些例子,在syslog中有1338行:
这是我编写的一些测试代码,试图破解这个问题,但没有解决方案:
import subprocess
#check_output returns byte string
stdoutdata = subprocess.check_output("wc --lines /var/log/syslog", shell=True)
print("2A stdoutdata: " + str(stdoutdata))
stdoutdata = stdoutdata.decode("utf-8")
print("2B stdoutdata: " + str(stdoutdata))
stdoutdata=stdoutdata.strip()
print("2C stdoutdata: " + str(stdoutdata))
Run Code Online (Sandbox Code Playgroud)
这个输出是:
2A stdoutdata:b'1338/var/log/syslog \n'
2B stdoutdata:1338/var/log/syslog
2C stdoutdata:1338/var/log/syslog
2D stdoutdata:1338/var/log/syslog
什么是Python字节串?
我所能找到的只是关于如何编码为bytestring或解码为ascii
或的主题utf-8
.我试图了解它是如何工作的.在普通的ASCII字符串中,它是一个数组或字符列表,每个字符代表一个0-255的ASCII值,这就是你知道数字代表什么字符的方式.在Unicode中,它是字符的8或16字节表示,告诉您它是什么字符.
那么什么是字节串?Python如何知道哪些字符代表什么?它是如何在引擎盖下工作的?既然你可以打印甚至返回这些字符串,它会显示字符串表示,我不太明白......
好的,所以我的观点肯定会在这里错过.我被告知这是一个不可变的字节序列,没有任何特殊的解释.
一个字节序列..好吧,让我们说一个字节:
'a'.encode()
返回b'a'
.
很简单.为什么我能看到一个?
说我得到的ASCII值一个,这样做:
printf "%d" "'a"
它返回97.好的,好的,ASCII字符的整数值a.如果我们将97解释为ASCII,比如在C中char
,那么我们得到这封信a
.很公平.如果我们将字节表示转换为位,我们得到:
01100001
2 ^ 0 + 2 ^ 5 + 2 ^ 6 = 97.凉.
那么为什么要'a'.encode()
返回b'a'
而不是01100001
??
如果它没有特定的解释,它不应该返回类似的东西b'01100001'
吗?
它似乎像ASCII一样解释它.
有人提到它调用__repr__
了bytestring,所以它以人类可读的形式显示.但是,即使我做了类似的事情:
with open('testbytestring.txt', 'wb') as f:
f.write(b'helloworld') …
Run Code Online (Sandbox Code Playgroud) 在Haskell中将String转换为ByteString的最佳方法是什么?
我对这个问题的直觉反应是
import qualified Data.ByteString as B
import Data.Char (ord)
packStr = B.pack . map (fromIntegral . ord)
Run Code Online (Sandbox Code Playgroud)
但这似乎并不令人满意.
我是一个Haskell新手,并且在弄清楚如何模式匹配时遇到了一些麻烦ByteString
.在[Char]
我的函数的版本是这样的:
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Run Code Online (Sandbox Code Playgroud)
正如所料,这会过滤掉字符串中出现的所有"ab".但是,我在尝试将其应用于a时遇到问题ByteString
.
天真的版本
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
Run Code Online (Sandbox Code Playgroud)
产量
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
Run Code Online (Sandbox Code Playgroud)
[]
显然是罪魁祸首,因为它是一个常规String
而非一个ByteString
.Subbing in …
我试图简单地将UTF-8编码的数据输出到控制台.
我已经设法完成了这个String
,但现在我想做同样的事情ByteString
.有一个很好的快速方法吗?
这是我到目前为止所做的,它不起作用:
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)
main :: IO ()
main = putStr $ pack "?ušpajž???"
Run Code Online (Sandbox Code Playgroud)
打印出来uapaj~?,?
,呃.
我想要获得最新的GHC 6.12.1的答案,尽管我也希望听到以前版本的答案.
谢谢!
更新:简单地读取和输出相同的UTF-8编码的文本行似乎正常工作.(使用Data.ByteString.Char8
,我只是做一个putStr =<< getLine
.)但是.hs文件中的打包值,如上例所示,拒绝正确输出...我一定做错了什么?
import json
import requests
url = 'http://developer.usa.gov/1usagov.json'
r = requests.get(url, stream=True)
for line in r.iter_lines():
if line:
print (json.loads(line))
Run Code Online (Sandbox Code Playgroud)
给出了这个错误:
TypeError: can't use a string pattern on a bytes-like object
Run Code Online (Sandbox Code Playgroud)
通过浏览器查看时,我确实看到响应是一个Json,但请求库说它像对象一样的字节为什么呢?
我对SPOJ上的PRIME1问题的尝试一直很糟糕.我发现使用ByteString 实际上有助于在问题文本中阅读的性能.但是,使用ByteString写出结果实际上比使用Prelude函数稍慢.我想知道我做错了,或者这是否是预期的.
我使用(putStrLn.show)和ByteString等效三种不同的方式进行了分析和计时:
我期望数字2和3执行速度较慢,因为您在一个函数中构建列表并在另一个函数中使用它.通过在生成数字时打印数字,我避免为列表分配任何内存.另一方面,每次调用putStrLn时都要进行一次调用系统调用.对?所以我测试了,#1实际上是最快的.
使用选项#1和Prelude([Char])函数实现了最佳性能.我期望我的最佳表现是ByteString的选项#1,但事实并非如此.我只使用懒惰的ByteStrings,但我认为这不重要.是吗?
一些问题:
我的工作假设是,如果你没有将它们与其他文本组合,用ByteString写出Integer是比较慢的.如果您将Integers与[Char]结合使用,那么使用ByteStrings可以获得更好的性能.即,ByteString重写:
putStrLn $ "the answer is: " ++ (show value)
Run Code Online (Sandbox Code Playgroud)
将比上面写的版本快得多.这是真的?
谢谢阅读!
原谅如果这是一个很长的问题:
我用Python编程了大约六个月.自学,从Python教程开始,然后是SO,然后只使用谷歌的东西.
这是悲伤的部分:没有人告诉我所有字符串都应该是Unicode.不,我不是在撒谎或说谎,但教程在哪里提到它?我也看到大多数示例只是使用byte strings
,而不是Unicode strings.
我只是浏览并在SO上遇到这个问题,它说明Python中的每个字符串应该是一个Unicode字符串.这让我哭了!
我读到默认情况下Python 3.0中的每个字符串都是Unicode,所以我的问题是2.x:
我应该这样做:
print u'Some text'
还是只是print
'Text'
?
一切都应该是Unicode,这是否意味着,就像说我有一个tuple
:
t = ('First', 'Second'), it should be t = (u'First', u'Second')?
我读过我可以做一个from __future__ import unicode_literals
然后每个字符串都是一个Unicode字符串,但是我应该在容器内执行此操作吗?
读/写文件时,我应该使用该codecs
模块.对?或者我应该使用标准方式或阅读/写作和/ encode
或decode
在需要的地方?
如果我从中获取字符串raw_input()
,我应该将其转换为Unicode吗?
在2.x中处理所有上述问题的常用方法是什么?该from __future__ import unicode_literals
声明?
对不起是一个这样的菜鸟,但这改变了我长期以来一直在做的事情,所以我很困惑.
我有一个懒惰ByteString
的函数,我希望有严格的ByteStrings
返回列表(懒惰应该转移到输出的列表类型).
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
csVals :: L.ByteString -> [B.ByteString]
Run Code Online (Sandbox Code Playgroud)
我想因各种原因这样做,有几个lexing函数需要严格的ByteString
s,我可以保证ByteString
s输出中csVal
的输出严格s 非常小.
如何在ByteString
没有分块的情况下进行"严格化" ?
我想采取一个懒惰ByteString
,并使一个严格ByteString
包含其所有数据.
bytestring ×10
haskell ×5
python ×4
string ×4
python-3.x ×3
io ×2
unicode ×2
chunking ×1
ghc ×1
json ×1
performance ×1
strict ×1
subprocess ×1