背景
我在尝试搜索某些CSV文件时遇到问题。
我已经阅读了python文档:http://docs.python.org/2/library/csv.html
关于csv模块的csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
对象。
我的理解是csv.DictReader
假设文件的第一行/行是字段名,但是,我的csv字典文件只是以“key”,“value”开头,并且持续至少500,000行。
我的程序会询问用户他们正在寻找的标题(因此是键),并使用打印功能将值(第2列)显示在屏幕上。我的问题是如何使用csv.dictreader搜索特定的密钥,并打印其值。
示例数据: 下面是csv文件及其内容的示例......
"Mamer","285713:13"
"Champhol","461034:2"
"Station Palais","972811:0"
所以如果我想找到“Station Palais”(输入),我的输出将是972811:0。我能够操纵字符串并创建整个程序,我只需要帮助csv.dictreader.I感谢任何帮助。
编辑部分:
import csv
def main():
with open('anchor_summary2.csv', 'rb') as file_data:
list_of_stuff = []
reader = csv.DictReader(file_data, ("title", "value"))
for i in reader:
list_of_stuff.append(i)
print list_of_stuff
main()
答案 0 :(得分:2)
您链接的文档提供了答案的一半:
class
csv.DictReader
( csvfile,fieldnames = None,restkey = None,restval = None,dialect ='excel',* args,** kwds )[...]将读取的信息映射到一个字典,其密钥由可选的 fieldnames 参数给出。如果省略 fieldnames 参数, csvfile 第一行中的值将用作字段名。
如果传递了fieldnames
参数,给定的文件将不会将其第一条记录解释为标题(将使用该参数)。
# file_data is the text of the file, not the filename
reader = csv.DictReader(file_data, ("title", "value"))
for i in reader:
list_of_stuff.append(i)
(显然;我一直遇到麻烦)产生以下数据结构:
[{"title": "Mamer", "value": "285713:13"},
{"title": "Champhol", "value": "461034:2"},
{"title": "Station Palais", "value": "972811:0"}]
可能需要通过以下方式进一步按摩到标题到值的映射:
data = {}
for i in list_of_stuff:
data[i["title"]] = i["value"]
现在只需使用data
的键和值即可完成任务。
这里是字典理解:
data = {row["title"]: row["value"] for row in csv.DictReader(file_data, ("title", "value"))}
答案 1 :(得分:0)
目前接受的答案很好,但有一种更直接的方式来获取数据。 Python中的dict()
构造函数可以采用任何迭代。
此外,您的代码可能在Python 3上存在问题,因为Python 3的csv模块期望文件以文本模式而不是二进制模式打开。您可以使用io.open
代替open
来使代码与2和3兼容。
import csv
import io
with io.open('anchor_summary2.csv', 'r', newline='', encoding='utf-8') as f:
data = dict(csv.reader(f))
print(data['Champhol'])
作为警告,如果您的csv文件在第一列中有两行具有相同值,则后一个值将覆盖之前的值。 (对于其他发布的解决方案也是如此。)
如果你的程序真的只打印结果,那么真的没有理由建立一个键控字典。
import csv
import io
# Python 2/3 compat
try:
input = raw_input
except NameError:
pass
def main():
# Case-insensitive & leading/trailing whitespace insensitive
user_city = input('Enter a city: ').strip().lower()
with io.open('anchor_summary2.csv', 'r', newline='', encoding='utf-8') as f:
for city, value in csv.reader(f):
if user_city == city.lower():
print(value)
break
else:
print("City not found.")
if __name __ == '__main__':
main()
这种技术的优点是csv没有加载到内存中,数据只迭代一次。我还在两个键上添加了一些代码调用lower
,以使匹配不区分大小写。另一个优点是,如果用户请求的城市靠近文件的顶部,它几乎立即返回并停止查看文件。
尽管如此,如果主要考虑搜索性能,则应考虑将数据存储在数据库中。