urldecode Python 中的列表

urldecode a list in Python

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

我正在尝试打开 CSV 文件并解码 URL 文本,例如example.com?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 然后保存文件。我可以用一个字符串轻松地做到这一点,但我很难用 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'

对我来说,您可能会从 reader 中获取单独的行。我猜这些可能可以通过索引获得。

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

还有一个 DictReader 以防列表抽象不够用。

您的方法有一些错误。

  1. 您似乎没有 CSV,而是一个每行一个值的常规文本文件。这里使用 csv 模块没有任何好处, Python 可以很好地读取文本文件。事实上,"line-wise"打开文本文件进行阅读时的默认模式。
  2. 当您读取或写入任何文本文件时,您必须声明文本文件的编码,当您open() 它。 Python 没有神奇的文本编码检测器,当您不指定编码时,正确读取文件可能在您的机器上正常工作并在另一台机器上中断,因为不同的计算机配置可能有不同的 "default" 编码。
  3. URL是复杂的数据结构,对它们应用"urldecode"还不够好。您需要 解析 它们 - 幸运的是 URL 解析器内置于 Python 中。 URL 解析器将为您提供一个 ParseResult 对象,该对象方便地将 URL 的所有不同部分公开为属性。
  4. URLs由很多部分组成,查询字符串就是其中之一。
  5. 查询字符串是复杂的数据结构,对它们应用 "urldecode" 还不够好。您需要 解析 它们——幸运的是,Python 中内置了一个查询字符串解析器。查询字符串解析器将自动为您解码这些值,并为您提供一个 dict,您可以使用键访问它。
  6. .append 是一个函数。你不能给它赋值(.append = '...'),你需要调用它(.append('...'))。
  7. 最后,使用 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)

使用list comprehensions并删除不必要的注释,我们可以将上面的代码压缩很多:

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)