Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 必须是str,而不是bytes';str';没有属性';解码';_Python_String_Mongodb_Python 3.x - Fatal编程技术网

Python 必须是str,而不是bytes';str';没有属性';解码';

Python 必须是str,而不是bytes';str';没有属性';解码';,python,string,mongodb,python-3.x,Python,String,Mongodb,Python 3.x,我可以从mongo数据库中提取以下简单代码: import sys import codecs import datetime from pymongo import MongoClient sys.stdout = codecs.getwriter('utf8')(sys.stdout) mongo_db = "database" collectionId = "coll name" def main(argv): client = MongoClient("mongod

我可以从mongo数据库中提取以下简单代码:

import sys
import codecs
import datetime
from pymongo import MongoClient

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

mongo_db = "database"
collectionId = "coll name"

def main(argv):
        client = MongoClient("mongodb://localhost:27017")
        db = client[mongo_db]
        collection = db[collectionId]

        cursor = collection.find({})
        for document in cursor:
        #       if "content" in document:
        #            sys.stdout.write(
        #                    "|"+(document['content'] if document['content'] is not None else "")+"\n")
                for key, value in document.items() :
                        sys.stdout.write(key.decode('utf-8'))

if __name__ == "__main__":
    main(sys.argv)
像这样运行它,让我

AttributeError:“str”对象没有属性“decode”

所以。。。那是str对象吗?但是如果我删除了解码,我会

TypeError:必须是str,而不是bytes

而且,它不像是在打印任何东西,所以,它一定是在第一个关键点失败了?但是第一个键既不能是str也不能是bytes???我如何打印这个

使用flush编辑测试:

                for key, value in document.items() :
                    sys.stdout.write("1")
                    sys.stdout.flush()
                    sys.stdout.write(key.decode('utf-8'))
                    sys.stdout.flush()
我将的更改为,得到了错误

~/Desktop$ python3 sentimongo.py
Traceback (most recent call last):
  File "sentimongo.py", line 30, in <module>
    main(sys.argv)
  File "sentimongo.py", line 24, in main
    sys.stdout.write("1")
  File "/usr/lib/python3.4/codecs.py", line 374, in write
    self.stream.write(data)
TypeError: must be str, not bytes
~/Desktop$python3 sentimongo.py
回溯(最近一次呼叫最后一次):
文件“sentimongo.py”,第30行,在
主(系统argv)
文件“sentimongo.py”,第24行,在main中
系统标准写入(“1”)
写入文件“/usr/lib/python3.4/codecs.py”,第374行
self.stream.write(数据)
TypeError:必须是str,而不是bytes
这一行更改了标准输出,因此它执行的操作与您通常看到的不同。在Python3中,您实际上不需要关心如何将内容转换为utf8,因为所有内容都已经是unicode字符串

如果删除该行,则可以编写一个普通字符串(甚至打印一个)

这一行更改了标准输出,因此它执行的操作与您通常看到的不同。在Python3中,您实际上不需要关心如何将内容转换为utf8,因为所有内容都已经是unicode字符串


如果删除该行,编写一个普通字符串(甚至打印一个)应该可以正常工作。

您使用的是Python 3.x。字符串没有解码方法。如果您需要字符串中的字节对象,那么
encode
应该可以。可能有一些字节和一些str键。你可以尝试<代码>打印(列表(文档.KEYSH))<代码>,看看你使用的是<代码> sys .STDUT。写< /COD>,考虑添加一个<代码> sys .StdOut.FrHuSH()/代码>之后,输出立即更新。这样你就可以判断你的两次运行(是否有解码)产生了不同数量的密钥。(可能是的)。@poke看看编辑中的新数据……可能是因为我必须通过python3的一个参数调用它吗?因为,它甚至没有打印1,我有一个类似的脚本,从mysql中提取,没有出现这样的错误,但使用的是python 2.7哦,我完全错过了
sys.stdout=codecs.getwriter('utf8'))(sys.stdout)
行。您应该删除它。您使用的是Python 3.x。字符串没有
解码
方法。如果您需要字符串中的bytes对象,那么
编码
应该可以。可能有一些字节和str键。您可以尝试
打印(list(document.keys())看看有什么样的密钥。既然你在使用<代码> sys .STDUT。写< /COD>,考虑添加一个<代码> sys .StdOut.FrHuSH()/代码>之后,输出立即更新。这样你就可以判断你的两次运行(是否有解码)产生了不同数量的密钥(他们可能会这样做)。@poke查看编辑中的新数据……可能是因为我必须通过python3的参数调用它吗?因为,它甚至没有打印1,我有一个类似的脚本,从mysql中提取,没有出现这样的错误,但使用的是Python2.7Oh,我完全错过了
sys.stdout=codecs.getwriter('utf8')(sys.stdout)
line。您应该删除它。
sys.stdout = codecs.getwriter('utf8')(sys.stdout)