Python для проверки данных CSV - PullRequest
       0

Python для проверки данных CSV

0 голосов
/ 10 сентября 2018

У меня есть простой файл данных CSV, который имеет две строки, а именно Object_Id и VALUE, и каждый индекс Object ID имеет соответствующее значение для того же индекса в другой строке (VALUE).Мое намерение состоит в том, чтобы прочитать эти индексы и проверить эти данные с ожидаемыми данными.

Я могу прочитать файл CSV, но не уверен, как проверить данные.Вот фрагмент файла csv:

Obj ID,    Value,    Time Stamp
13,    41.0,    2018-09-10 23:05:30
14,    14.0,    2018-09-10 23:05:20
13,    41.0,    2018-09-10 23:05:20
14,    14.0,    2018-09-10 23:05:09

Вот код, который я пытаюсь:

import csv
with open('testoutfile1.csv', 'r') as csvfile:
reader = csv.reader (csvfile, delimiter=';', quotechar='|')
observed_output=[]
expected_output=[]
for row in reader:
    #print(';  '.join(row))
    observed_output = {row[0]:row[1]}
    print(observed_output)
expected_output= {'Obj ID': 'Value','13':'41.0', '14':'14.0'}
print(expected_output)

for key in expected_output:
    if key in observed_output:
            print (key)
            print (observed_output[key])
            print (expected_output [key])
        if (observed_output[key])== (expected_output [key]):
            print ("Test Passed")
        elif (observed_output[key])!= (expected_output [key]):
            print ("Test Failed")

А вот вывод, который я получаю, который, безусловно, отсутствует, чтобы соответствовать другимзапись / записи.Не могли бы вы прокомментировать?

{'Obj ID': 'Value'}
{'13': '41.0'}
{'14': '14.0'}
{'13': '41.0'}
{'14': '14.0'}
{'Obj ID': 'Value', '13': '41.0', '14': '14.0'}
14
14.0
14.0
Test Passed

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

expected_output, на мой взгляд, должен быть более простым словарем

expected_output = {'13':'41.0', '14':'14.0'}

далее вы можете продолжить следующим образом

data = open('...')
next(data) # skip headers
for line in data:
    id, val, *_ = [item.strip() for item in line.split(',')]
    if id in expected_output and val == expected_output[id]:
        # the observed output is the same as expected
        ...
    else:
        # observed is unexpected
        ...
0 голосов
/ 11 сентября 2018

Попробуйте вот что:

from pathlib import Path
import pandas as pd
import csv    

doc = """Obj ID,Value,Time Stamp
13,41.0,2018-09-10 23:05:30
14,14.0,2018-09-10 23:05:20
13,41.0,2018-09-10 23:05:20
14,14.0,2018-09-10 23:05:09"""

#replicate a data file
Path('temp.csv').write_text(doc)  


#read a csv to dicts
def read_dicts(filename, sep=",", names=['id', 'value', 'time']): 
    with open(filename, 'r') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=sep, fieldnames=names)
        return [row for row in reader][1:]            
dicts = read_dicts('temp.csv')
# you can start checking *dicts* from here

# use pandas 
df = pd.read_csv('temp.csv', names = ['id', 'value', 'time'], header=0)
# this is not a great way to check (you loose information), but it seems what you ask for
assert df['value'].tolist() == [41.0, 14.0, 41.0, 14.0]

# if the data on objects does not change, check this way, write this to a fucntion
assert (df[df.id==13].value == 41).all()
assert (df[df.id==14].value == 14).all()

# you can replicate the above with a csv too.

Для правильной проверки вам необходимо объяснить свои предположения относительно структуры данных (значения изменяются со временем?) И соответствующим образом настроить проверку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...