У меня проблемы с чтением значений из сохраненного файла csv. Это часть файла csv, который у меня есть:
000000216739.jpg, 224, [ 0. 0. 0. 0. 36. 44. 4. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 14.
8. 0. 0. 0. 0. 0. 0. 0. 0. 0. 7. 0. 3. 0. 0. 0. 0. 0.
0. 0. 0. 0. 3. 1. 2. 0. 0. 0. 0. 0. 1. 0. 0. 1. 2. 0.
3. 0. 0. 0. 0. 0.],
[ 0. 0. 0. 0. 35. 33. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 36. ...]
(отформатирован в соответствии с имеющимся у меня csv файлом)
Проблема в том, что я действительно не уверен, как читать каждое отдельное значение запятой отдельно. Когда я:
with open(CSVFilepath) as f:
reader = csv.reader(f,delimiter=',')
for row in reader:
print(row)
print(row[0])
print(row[1])
print(row[2])
он возвращает:
['000000216739.jpg', '224', '[ 0. 0. 0. 0. 36. 44. 4. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 14.']
000000216739.jpg
224
[ 0. 0. 0. 0. 36. 44. 4. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 14. ]
Значение 224 - это фактически количество [] строк (строк) в образе 000000216739.jpg.
То, что я пытаюсь прочитать, - это массив формы 2d numpy (224,60) с фиксированным 60 для всех изображений.
Итак, я пытаюсь прочитать: например для изображения 123.jpg (все в одном массиве формы (224 на 60):
[[ 0. 0. 0. 0. 36. 44. 4. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 14.
8. 0. 0. 0. 0. 0. 0. 0. 0. 0. 7. 0. 3. 0. 0. 0. 0. 0.
0. 0. 0. 0. 3. 1. 2. 0. 0. 0. 0. 0. 1. 0. 0. 1. 2. 0.
3. 0. 0. 0. 0. 0.],
... (more np arrays)...
[ 6. 0. 0. 35. 64. 0. 0. 0. 0. 0. 0. 0. 20. 11. 27. 23. 5. 0.
0. 0. 0. 0. 0. 0. 5. 0. 10. 1. 0. 0. 0. 0. 0. 0. 0. 0.
6. 2. 3. 0. 0. 0. 0. 0. 0. 0. 0. 0. 2. 2. 1. 0. 0. 0.
0. 0. 0. 0. 0. 0.]]
Могу я спросить, что мне делать ..? Кроме того, этот файл довольно большой, и мне нужен способ его эффективного чтения ... Любая помощь будет принята с благодарностью!






Я предполагаю, что ваши данные такие: filename, nrows, [imrow1], [imrow2], [imrow3], ..., [imrow_nrows] затем выполните следующие действия, чтобы извлечь изображение из ваших данных. Сообщите нам, если ваши данные отформатированы по-другому.
with open(CSVFilepath) as f:
reader = csv.reader(f,delimiter=',')
for row in reader:
fname=row[0]
nrows=int(row[1])
imdata=np.array(row[2:]) #Get from the 2 element to the end. Could also do row[:-nrows]
#might need to make each element an int or float.
###reshape if that's what you need and do something with the image
Я создал файл с именем testdata.csv со строкой 000000216739.jpg, 224, [0. 0. 0. 0. 36. 44. 4. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 14.8. 0. 0. 0. 0. 0. 0. 0. 0. 0. 7. 0. 3. 0. 0. 0. 0. 0.0. 0. 0. 0. 3. 1. 2. 0. 0. 0. 0. 0. 1. 0. 0. 1. 2. 0.3. 0. 0. 0. 0. 0.], [0. 0. 0. 0. 35. 33. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 9. 36.]
import csv import numpy as np with open('testdata.csv') as f: reader = csv.reader(f,delimiter=',') for row in reader: fname=row[0] nrows=int(row[1]) imdata=np.array(row[2:]) С этим кодом все работает как положено. Данные соответствуют моим предположениям?
Похоже, что это то же самое ... Я также добавил изображение (снимок экрана) файла csv ... не уверен, что он такой же ...?
В вашем примере кода вы ссылаетесь на строку [1], поэтому если вы удалите int из строки, изменит ли это что-нибудь? Ошибка говорит мне, что row [1] не существует, но вы сами ее использовали.
О нет ... похоже, что ошибка индекса списка вне допустимого диапазона все еще существует.
Позвольте нам продолжить обсуждение в чате.
поэтому, если вы напечатаете (row [1]), как в вашем коде, вы также получите ошибку вне индекса. Может быть, ваши данные отформатированы не так, как вы думаете - может быть, первая строка пуста и нет строк? Но, учитывая ваш пример, этот код на самом деле не сильно отличается.
Ваш файл не является правильным файлом csv, и вы не должны читать его как файл csv.
Разрыв строки в файле csv представляет собой новую строку, тогда как очевидно, что в вашем файле они этого не означают - вы хотите прочитать числа внутри [ и ], но они не разграничены должным образом.
Способ проанализировать этот файл был бы
with open(file,'r') as fin:
f = fin.readlines()
f = ' '.join(f) # remove newlines
listrows = f.split('[')
listrows = [l.split(']')[0] for l in listrows] # Get string between '[' and ']'
matrix = [row.split('.') for row in listrows] # This is now a 2D matrix
final = [[int(e.replace(' ','')) for e in row] for row in matrix] # Here goes your final matrix
Я широко использовал понимание списка, так что это не доходит до 30 строк. Попробуйте запустить это.
Привет, @Rocky Li, большое спасибо за помощь. Могу я спросить, что вы имеете в виду под словом strip -> int () ..?
Потому что я пробовал это: для row2 в матрице: output = [a for a in row2 if a.isnumeric ()] print (output), но он вернул мне пустые списки ...
@ReineFang, который не будет работать, потому что вы будете смотреть на ' 10' и т. д., Это строки, поэтому a.isnumeric вернет false. Под полосой я имею в виду, что вы можете удалить пробелы с каждого из них с помощью a.replace(' ',''), а затем преобразовать его с помощью int(a).
Мне очень жаль, но не могли бы вы обновить приведенный выше код? Я немного запутался ...
@ReineFang Я пробовал, если все равно не работает, может быть, вы хотите прислать мне полный файл?
Это будет действительно здорово, но могу я спросить, как я могу послать вам ..?
@ReineFang у вас есть ссылка на github?
Позвольте нам продолжить обсуждение в чате.
Привет @The Puternerd, большое спасибо за помощь. Но он дает эту ошибку: строка 27, в <module> nrows = int (row [1]) IndexError: индекс списка вне допустимого диапазона