Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字典正确地放入CSV文件中,以便按键值搜索CSV文件?_Python_Csv - Fatal编程技术网

Python 如何将字典正确地放入CSV文件中,以便按键值搜索CSV文件?

Python 如何将字典正确地放入CSV文件中,以便按键值搜索CSV文件?,python,csv,Python,Csv,我试图把一个字典,其中有两个属性的ID和状态到一个CSV文件。将其正确放入CSV文件后,我希望按ID搜索某一行,然后返回与该行ID关联的状态。我遇到的问题是,在读取过程中的for循环期间,该行是一个带有“ID,Status”:“1,Off”的字典。由于字段名和值都在一起,所以我无法真正按特定ID过滤或获取特定状态。我希望每一行都像'ID':1,'Status':'Off'我不是把字典放错了,就是试图用for循环读错了。如果有任何建议,我都会非常感激,因为我对CSV文件还是相当陌生的!谢谢 这是我

我试图把一个字典,其中有两个属性的ID和状态到一个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)

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

导入csv
导入操作系统
def按id查找行(CSV文件,输入id):
端口状态=无
reader=csv.DictReader(csvfile)
对于读取器中的行:
打印(f“行:{ROW}”)
如果int(row['ID'])==int(input\u ID):
端口状态=行['status']
返回端口状态
字段=['ID','Status']
dict_数据=[
{'ID':1,'Status':'Off'},
{'ID':2,'状态':'Off'},
{'ID':3,‘状态’:‘关闭}
]
输入_id=3
文件名='ports.csv'
file_exists=os.path.exists(文件名)
如果文件不存在:
打开(文件名为“w”,换行符为“”)作为文件:
writer=csv.DictWriter(文件,字段名=字段)
writer.writeheader()
对于dict_数据中的数据:
writer.writerow(数据)
将open(filename,'r')作为csvfile:
pstatus=按id查找行(csvfile,输入id)
答复={
普斯塔斯
}
打印(答复)
我做了一些改变:

  • 去掉重复的读取代码并将其放入函数中
  • id
    是Python保留字,所以我用
    input\u id
    替换了它
  • 我删除了DictReader构造函数的
    分隔符
    参数。我这样做是因为我记不起那个论点做了什么&我只是想试试,而不是去查。这本可以解决问题的

我强烈建议为此使用
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)

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