使用Python的csv.dictreader搜索特定键,然后打印其值

时间:2013-05-20 01:49:20

标签: csv python-2.7 dictionary

背景

我在尝试搜索某些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()

2 个答案:

答案 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,以使匹配不区分大小写。另一个优点是,如果用户请求的城市靠近文件的顶部,它几乎立即返回并停止查看文件。

尽管如此,如果主要考虑搜索性能,则应考虑将数据存储在数据库中。