用Python解码列表

用Python解码列表,python,urllib,urldecode,Python,Urllib,Urldecode,我是个傻瓜,我在这个简单的代码上挣扎了太久,所以我想我应该寻求帮助 我正在尝试打开CSV并解码URL文本,例如example.com?标题=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0,然后保存文件。我可以用字符串轻松地完成这项工作,但我很难用CSV中的行来完成 我迄今为止的努力: #reading file1 = open('example.csv', 'r')

我是个傻瓜,我在这个简单的代码上挣扎了太久,所以我想我应该寻求帮助

我正在尝试打开CSV并解码URL文本,例如example.com?标题=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0,然后保存文件。我可以用字符串轻松地完成这项工作,但我很难用CSV中的行来完成

我迄今为止的努力:

#reading
file1 = open('example.csv', 'r')
reader = csv.reader(file1)
url = []
for rows in reader:
    url.append = urllib.unquote(rows).decode('utf8')
    #also tried "url.append(urllib.unquote(rows).decode('utf8'))", but same error
file1.close() 

#writing
file2 = open('example.csv', 'w')
writer = csv.writer(file2)
writer.writerows(url)
file2.close()
编辑: 我收到的错误

AttributeError: 'list' object has no attribute 'split'

在我看来,您可能会从读卡器中获得单独的行。我猜这些可能是通过索引提供的

for row in reader
    url.append = urllib.unquote(row[0]).decode('utf8')

还有一个案例列表抽象还不够。

您的方法中有一些错误

您似乎没有CSV,而是一个每行有一个值的常规文本文件。在这里使用csv模块没有任何好处,Python可以很好地读取文本文件。事实上,当你打开一个文本文件进行阅读时,逐行扫描是默认模式。 当您读取或写入任何文本文件时,必须在打开文本文件时声明该文本文件所使用的编码。Python没有神奇的文本编码检测器,当您不指定编码时,正确读取文件可能在您的机器上工作,而在另一台机器上中断,因为不同的计算机配置可能有不同的默认编码。 URL是复杂的数据结构,对其应用urldecode是不够的。您需要解析它们——幸运的是,Python中内置了URL解析器。URL解析器将为您提供一个ParseResult对象,该对象方便地将URL的所有不同部分作为属性公开。 URL由许多部分组成,查询字符串就是其中之一。 查询字符串是复杂的数据结构,对其应用urldecode不够好。您需要解析它们——幸运的是,Python中内置了查询字符串解析器。查询字符串解析器将自动为您解码这些值,并为您提供一个dict,您可以使用键访问该dict。 .append是一个函数。无法分配给它。append=“…”,需要调用它。append“…”。 最后,使用with块处理文件更容易,因为with块会自动关闭文件。 比较:

from urllib.parse import urlparse, parse_qs

with open('example.txt', 'r', encoding='utf-8') as file1:
    titles = []

    for url in file1:
        parts = urlparse(url)
        # -> ParseResult(
        #      scheme='http', netloc='example.com', path='', params='',
        #      query='title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0',
        #      fragment='')

        q = parse_qs(parts.query)
        # -> {'title': ['правовая защита']}

        if 'title' in q:
            titles.append(q['title'][0])

    with open('titles.txt', 'w', encoding='utf-8') as file2:
        file2.writelines(titles)
通过使用和删除不必要的注释,我们可以对上述代码进行大量压缩:

from urllib.parse import urlparse, parse_qs

with open('example.txt', 'r', encoding='utf-8') as file1:
    queries = [parse_qs(urlparse(url).query) for url in file1]

with open('titles.txt', 'w', encoding='utf-8') as file2:
    titles = [q['title'][0] for q in queries if 'title' in q]
    file2.writelines(titles)

您遇到的错误是什么?如果要了解如何使用append,请找到一个很好的示例。您使用错误。url.appendurllib.unquoterows.decode'utf8'?很抱歉,我收到的错误是AttributeError:'list'对象没有属性'split'。我也尝试了上面的解决方案,但仍然是相同的错误。我编辑了原始帖子以反映上述内容顺便说一句,您的CSV文件中似乎只有一列,即每行一个URL。这不是CSV,这是一个普通的老文本文件。谢谢你的详细回复,我可以看到我哪里出错了!当然,我在变量命名上犯了一些错误,现在我已经在代码中纠正了它们。回答得很好!我认为应该是qs['title'][0],但是parse_qs返回一个lists@lemonhead这是一个很好的观点。我已经添加了这一点,并且用了一种更短的方式来写它。