【问题标题】:How can you properly put a dictionary into a CSV file so you can search the CSV File by key values?如何正确地将字典放入 CSV 文件中,以便通过键值搜索 CSV 文件?
【发布时间】:2021-06-04 17:04:55
【问题描述】:

我正在尝试将具有 ID 和 Status 两个属性的字典放入 CSV 文件中。将其正确放入 CSV 文件后,我想按 ID 搜索某一行,然后返回与该行 ID 相关联的状态。我遇到的问题是,在读取期间的 for 循环期间,该行是一个字典,带有“ID,Status”:“1,Off”。由于字段名称和值都在一起,我无法真正按特定 ID 过滤或获取特定状态。我希望每一行都像 'ID': 1, 'Status': 'Off' 我要么把字典放错了,要么试图用 for 循环读错。任何指针都将不胜感激,因为我对 CSV 文件还是很陌生!谢谢!

这是我目前正在使用的。它检查 Csv 文件是否存在,如果不存在,它会创建并填充它,然后尝试读取它需要的数据。否则,它只会尝试根据传入的 ID 获取所需的数据。

fields = ['ID', 'Status']
dict_data = [
    {'ID': 1, 'Status': 'Off'},
    {'ID': 2, 'Status': 'Off'},
    {'ID': 3, 'Status': 'Off'}
]
    file_exists = os.path.exists("ports.csv")
    if file_exists:
        with open(filename, 'r') as csvfile:
            reader = csv.DictReader(csvfile, delimiter=' ')
            for row in reader:
                if row['ID'] == int(id):
                    port_status = row['Status']
    else:
        with open(filename, 'w', newline='') as file:
            writer = csv.DictWriter(file, fieldnames=fields)
            writer.writeheader()
            for data in dict_data:
                writer.writerow(data)

        with open(filename, 'r') as csvfile:
            reader = csv.DictReader(csvfile, delimiter=' ')
            for row in reader:
                if row['ID'] == int(id):
                    port_status = row['Status']
    response = {
        port_status
    }
    return jsonify(response)

【问题讨论】:

  • int(Id) 是传入的 ID,将用于搜索特定的行/记录。另外,我放在那里的 else 下的 write 块下的 reader 块,因此如果文件不存在,它会创建它,然后尝试读取它。
  • 您已经说过您所追求的行为,但您没有说明您在当前实现中看到的有问题的行为。你能澄清那部分吗?这可能会得到一个更简洁的答案。
  • 更新了问题,增加了涉及问题的更多细节以及我希望它做什么。

标签: python csv


【解决方案1】:

在尝试测试代码并进行一些清理的过程中,我修复了它。

import csv
import os

def find_row_by_id(csvfile, input_id):
        port_status = None
        reader = csv.DictReader(csvfile)
        for row in reader:
                print(f"ROW: {row}")
                if int(row['ID']) == int(input_id):
                        port_status = row['Status']
        return port_status


fields = ['ID', 'Status']
dict_data = [
    {'ID': 1, 'Status': 'Off'},
    {'ID': 2, 'Status': 'Off'},
    {'ID': 3, 'Status': 'Off'}
]
input_id = 3
filename = 'ports.csv'
file_exists = os.path.exists(filename)
if not file_exists:
        with open(filename, 'w', newline='') as file:
            writer = csv.DictWriter(file, fieldnames=fields)
            writer.writeheader()
            for data in dict_data:
                writer.writerow(data)

with open(filename, 'r') as csvfile:
        pstatus = find_row_by_id(csvfile, input_id)

response = {
        pstatus
}

print(response)

我做了一些改动:

  • 删除重复的读取代码并将其放入函数中。
  • id 是 Python 的保留字,所以我将其替换为 input_id
  • 我删除了您的 DictReader 构造函数中的 delimiter 参数。我这样做是因为我不记得那个论点做了什么,而不是查找它,我只是想尝试一下。这本来可以解决问题的。

【讨论】:

    【解决方案2】:

    我强烈建议为此使用pandas,因为查找既快速又简单,并且不需要遍历csv 文件中的所有行:

    import pandas as pd
    import os
    
    dict_data = [
        {'ID': 1, 'Status': 'Off'},
        {'ID': 2, 'Status': 'Off'},
        {'ID': 3, 'Status': 'Off'}
    ]
    
    filename = 'ports.csv'
    lookup_id = 3
    
    if os.path.exists(filename):
        df = pd.read_csv(filename)
        print(df['Status'][df['ID'] == lookup_id].iloc[0])
    else:
        df = pd.DataFrame(dict_data)
        df.to_csv(filename)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2020-06-11
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多