标签: bytestring

如何将Python 3字节字符串变量转换为常规字符串?

我已阅读XML电子邮件附件

bytes_string=part.get_payload(decode=False)
Run Code Online (Sandbox Code Playgroud)

有效负载以字节字符串形式出现,正如我的变量名所示.

我试图使用推荐的Python 3方法将此字符串转换为可以操作的可用字符串.

该示例显示:

str(b'abc','utf-8')
Run Code Online (Sandbox Code Playgroud)

如何将b(bytes)关键字参数应用于我的变量bytes_string并使用推荐的方法?

我尝试的方式不起作用:

str(bbytes_string, 'utf-8')
Run Code Online (Sandbox Code Playgroud)

string type-conversion bytestring python-3.x

93
推荐指数
4
解决办法
19万
查看次数

Python3子进程输出

我想运行Linux字数统计实用程序wc来确定当前在/ var/log/syslog中的行数,因此我可以检测到它正在增长.我尝试了各种测试,当我从wc获得结果时,它既包括行数也包括命令(例如,var/log/syslog).

所以它返回:1338/var/log/syslog但我只想要行数,所以我想剥离/ var/log/syslog部分,并保持1338.

我已经尝试将它从bytestring转换为字符串,然后剥离结果,但没有快乐.转换为字符串和剥离,解码等的相同故事 - 都无法产生我正在寻找的输出.

这些是我得到的一些例子,在syslog中有1338行:

  • b'1338/var/log/syslog \n'
  • 1338/var/log/syslog

这是我编写的一些测试代码,试图破解这个问题,但没有解决方案:

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 subprocess bytestring python-3.x

39
推荐指数
3
解决办法
5万
查看次数

什么是Python字节串?

什么是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)

python string bytestring

38
推荐指数
3
解决办法
4万
查看次数

将String转换为ByteString的最佳方法是什么?

在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)

但这似乎并不令人满意.

string haskell bytestring

31
推荐指数
3
解决办法
2万
查看次数

Haskell Bytestrings:如何模式匹配?

我是一个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 …

haskell pattern-matching bytestring pattern-synonyms

27
推荐指数
4
解决办法
6004
查看次数

使用Haskell输出UTF-8编码的ByteString

我试图简单地将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文件中的打包值,如上例所示,拒绝正确输出...我一定做错了什么?

unicode io haskell ghc bytestring

25
推荐指数
2
解决办法
9224
查看次数

TypeError:不能在类字节对象上使用字符串模式

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,但请求库说它像对象一样的字节为什么呢?

python string json bytestring python-3.x

25
推荐指数
1
解决办法
2万
查看次数

我什么时候使用ByteString,什么时候不使用?

我对SPOJ上的PRIME1问题的尝试一直很糟糕.我发现使用ByteString 实际上有助于在问题文本中阅读的性能.但是,使用ByteString写出结果实际上比使用Prelude函数稍慢.我想知道我做错了,或者这是否是预期的.

我使用(putStrLn.show)和ByteString等效三种不同的方式进行了分析和计时:

  1. 我测试每个候选人,看它是否是素数.如果是这样,我将它添加到列表并用(putStrLn.show)写出来
  2. 我列出了所有素数并使用(putStrLn.unlines.show)写出列表
  3. 我列出所有素数并使用map(putStrLn.show)写出列表

我期望数字2和3执行速度较慢,因为您在一个函数中构建列表并在另一个函数中使用它.通过在生成数字时打印数字,我避免为列表分配任何内存.另一方面,每次调用putStrLn时都要进行一次调用系统调用.对?所以我测试了,#1实际上是最快的.

使用选项#1和Prelude([Char])函数实现了最佳性能.我期望我的最佳表现是ByteString的选项#1,但事实并非如此.我只使用懒惰的ByteStrings,但我认为这不重要.是吗?

一些问题:

  • 你是否希望ByteStrings能够更好地将一堆Integer写入stdout?
  • 我错过了一种方式模式来生成并写出可以带来更好性能的答案吗?
  • 如果我只是将数字写为文本,那么,如果有的话,使用ByteString有什么好处?

我的工作假设是,如果你没有将它们与其他文本组合,用ByteString写出Integer是比较慢的.如果您将Integers与[Char]结合使用,那么使用ByteStrings可以获得更好的性能.即,ByteString重写:

putStrLn $ "the answer is: " ++ (show value)
Run Code Online (Sandbox Code Playgroud)

将比上面写的版本快得多.这是真的?

谢谢阅读!

io performance haskell bytestring

24
推荐指数
2
解决办法
1381
查看次数

Python和Unicode:一切都应该是Unicode

原谅如果这是一个很长的问题:

我用Python编程了大约六个月.自学,从Python教程开始,然后是SO,然后只使用谷歌的东西.

这是悲伤的部分:没有人告诉我所有字符串都应该是Unicode.不,我不是在撒谎或说谎,但教程在哪里提到它?我也看到大多数示例只是使用byte strings,而不是Unicode strings.我只是浏览并在SO上遇到这个问题,它说明Python中的每个字符串应该是一个Unicode字符串.这让我哭了!

我读到默认情况下Python 3.0中的每个字符串都是Unicode,所以我的问题是2.x:

  1. 我应该这样做:

    print u'Some text'还是只是print 'Text'

  2. 一切都应该是Unicode,这是否意味着,就像说我有一个tuple:

    t = ('First', 'Second'), it should be t = (u'First', u'Second')?

    我读过我可以做一个from __future__ import unicode_literals然后每个字符串都是一个Unicode字符串,但是我应该在容器内执行此操作吗?

  3. 读/写文件时,我应该使用该codecs模块.对?或者我应该使用标准方式或阅读/写作和/ encodedecode在需要的地方?

  4. 如果我从中获取字符串raw_input(),我应该将其转换为Unicode吗?

在2.x中处理所有上述问题的常用方法是什么?该from __future__ import unicode_literals声明?

对不起是一个这样的菜鸟,但这改变了我长期以来一直在做的事情,所以我很困惑.

python unicode bytestring

22
推荐指数
3
解决办法
3854
查看次数

将Lazy ByteString转换为严格的ByteString

我有一个懒惰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函数需要严格的ByteStrings,我可以保证ByteStrings输出中csVal的输出严格s 非常小.

如何在ByteString没有分块的情况下进行"严格化" ?

Update0

我想采取一个懒惰ByteString,并使一个严格ByteString包含其所有数据.

haskell strict lazy-evaluation chunking bytestring

20
推荐指数
3
解决办法
8841
查看次数