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 以防列表抽象不够用。
您的方法有一些错误。
- 您似乎没有 CSV,而是一个每行一个值的常规文本文件。这里使用
csv
模块没有任何好处, Python 可以很好地读取文本文件。事实上,"line-wise"打开文本文件进行阅读时的默认模式。
- 当您读取或写入任何文本文件时,您必须声明文本文件的编码,当您
open()
它。 Python 没有神奇的文本编码检测器,当您不指定编码时,正确读取文件可能在您的机器上正常工作并在另一台机器上中断,因为不同的计算机配置可能有不同的 "default" 编码。
- URL是复杂的数据结构,对它们应用"urldecode"还不够好。您需要 解析 它们 - 幸运的是 URL 解析器内置于 Python 中。 URL 解析器将为您提供一个
ParseResult
对象,该对象方便地将 URL 的所有不同部分公开为属性。
- URLs由很多部分组成,查询字符串就是其中之一。
- 查询字符串是复杂的数据结构,对它们应用 "urldecode" 还不够好。您需要 解析 它们——幸运的是,Python 中内置了一个查询字符串解析器。查询字符串解析器将自动为您解码这些值,并为您提供一个
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)
使用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)
我是菜鸟,我在这个简单的代码上苦苦挣扎了太久,所以我想我应该寻求帮助。
我正在尝试打开 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 以防列表抽象不够用。
您的方法有一些错误。
- 您似乎没有 CSV,而是一个每行一个值的常规文本文件。这里使用
csv
模块没有任何好处, Python 可以很好地读取文本文件。事实上,"line-wise"打开文本文件进行阅读时的默认模式。 - 当您读取或写入任何文本文件时,您必须声明文本文件的编码,当您
open()
它。 Python 没有神奇的文本编码检测器,当您不指定编码时,正确读取文件可能在您的机器上正常工作并在另一台机器上中断,因为不同的计算机配置可能有不同的 "default" 编码。 - URL是复杂的数据结构,对它们应用"urldecode"还不够好。您需要 解析 它们 - 幸运的是 URL 解析器内置于 Python 中。 URL 解析器将为您提供一个
ParseResult
对象,该对象方便地将 URL 的所有不同部分公开为属性。 - URLs由很多部分组成,查询字符串就是其中之一。
- 查询字符串是复杂的数据结构,对它们应用 "urldecode" 还不够好。您需要 解析 它们——幸运的是,Python 中内置了一个查询字符串解析器。查询字符串解析器将自动为您解码这些值,并为您提供一个
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)
使用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)