Различают "" и пустое значение при чтении CSV-файла с использованием Python - PullRequest
0 голосов
/ 19 апреля 2019

CSV-файл содержит такие значения, как "", "ab, abc" ,, "abc". Обратите внимание, я имею в виду пустое значение, как в неизвестном значении. Это отличается от "", где значение еще не было установлено. Я отношусь к этим двум ценностям по-разному. Мне нужен способ читать "" и пустое значение, и различать их. Я сопоставляю данные с числами так, что "" сопоставляется с 0, а ,, сопоставляется с NaN. Обратите внимание, что у меня нет проблемы с синтаксическим анализом, и поле, такое как "ab, abc", отлично разбирается с запятой в качестве разделителя. Проблема в том, что python читает "" и пустое значение, в виде пустой строки, такой как ''. И эти два значения не одинаковы и не должны быть сгруппированы в пустую строку.

Не только это, но мне также нужно написать CSV-файл так, чтобы "" записывался как "", а не ,, а NaN должен записываться как ,, (пустое значение).

Я изучил диалекты csv, такие как двойная кавычка, escapechar, quotechar, цитирование. Это НЕ то, что я хочу. Во всех этих случаях в данных появляется разделитель, т. Е. «Ab, abc», и, как я уже говорил, разбор со специальными символами не является проблемой.

Я не хочу использовать Панд. Единственное, о чем я могу думать, это регулярное выражение? Но это лишние затраты, если мне нужно обработать миллионы строк.

Мне нужно следующее поведение:

a = "\"\"" (or it could be a="" or a="ab,abc")
if (a=="\"\""):
    map[0]=0
elif(a==""):
    map[0]=np.nan
else:
    map[0] = a

Мой CSV-ридер выглядит следующим образом:

import csv
f = open(filepath, 'r')
csvreader = csv.reader(f)
for row in csvreader:
        print(row)

Я хочу выше поведение при чтении CSV-файлов, хотя. в настоящее время считываются только два значения: '' (пустая строка) или 'ab, abc'.

Я хочу прочитать 3 разных значения. '' пустая строка, '' '' строка с двойными кавычками и фактическая строка 'ab, abc'

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Решение, которое я вычислил, таково:

Если я изменю входной файл таким образом, что в строках в кавычках будет escapechar '\', ниже находится входной файл:

col1,col2,col3
"",a,b
\cde \,f,g
,h,i
\j,kl\,mno,p

Тогда пустое поле в двойных кавычках и пустое поле без кавычек можно разделить

csvreader = csv.reader(f, quotechar='\\')
    for row in csvreader:
        print(row)

Это мое лучшее решение на данный момент ...

0 голосов
/ 19 апреля 2019

просматривая модуль csv в исходном коде CPython (поиск IN_QUOTED_FIELD), у него нет внутреннего состояния, которое позволило бы вам это сделать.например, синтаксический анализ:

"a"b"c"d

анализируется как: 'ab"c"d', что может не соответствовать вашим ожиданиям.Например:

import csv
from io import StringIO

[row] = csv.reader(StringIO(
    '"a"b"c"d'))

print(row)

, в частности, кавычки обрабатываются только специально в начале полей, и все символы просто добавляются в поле при их обнаружении, а не в случае какого-либо специального поведения, которое вызывается при "не цитирующиеся поля

...