У меня есть каталог, который содержит большое количество файлов CSV (более 1000). Я использую python pandas library для подсчета количества столбцов в каждом файле CSV.
Но проблема в том, что разделитель, используемый в некоторых файлах CSV, - это не только "," but "|" and ";"
"," but "|" and ";"
Как решить эту проблему:
import pandas as pd
import csv
import os
from collections import OrderedDict
path="C:\\Users\\Username\\Documents\\Sample_Data_August10\\outbound"
files=os.listdir(path)
col_count_dict=OrderedDict()
for file in files:
df=pd.read_csv(os.path.join(path,file),error_bad_lines=False,sep=",|;|\|",engine='python')
col_count_dict[file]=len(df.columns)
Я храню его как словарь.
Я получаю сообщение об ошибке:
Error could possibly be due to quotes being ignored when a multi-char delimiter is used
Я использовал sep=None
, но это не сработало.
Изменить:
Один из csv выглядит так: Number|CommentText|CreationDate|Detail|EventDate|ProfileLocale_ISO|Event_Number|Message_Number|ProfileInformation_Number|Substitute_UserNo|User_UserNo
Второй вариант: Number,Description
Я не могу раскрыть данные. Я только что дал имя столбца, поскольку данные чувствительны.
После небольшого изменения настроек и использования состояния печати, чтобы выяснить, используя код andrey-portnoy, я узнал, что csv сниффер идентифицировал разделитель для "|" как "e", поэтому с помощью оператора if я изменил его на "|". Теперь он дает мне правильный результат.
Также вместо read()
я использовал readline()
. в следующей строке кода в ответ Andrey: dialect = csv.Sniffer().sniff(csvfile.read(1024))
Но проблема остается нерешенной. Я смог выяснить это после много осмотра, но каждый раз, когда я, возможно, не буду правильно догадываться, и это может привести к ошибке.
Любая помощь будет ожидаться.
Задав разделитель как sep=",|;|\|"
, вы делаете эту целую строку разделителем.
Вместо этого вы хотите использовать Sniffer из модуля csv
чтобы обнаруживать диалоги CSV, используемые в каждом файле, в частности разделитель.
Например, для одного файла example.csv
:
import csv
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
sep = dialect.delimiter
df = pd.read_csv('example.csv', sep=sep)
Не включайте движок Python по умолчанию, так как он намного медленнее.
raise Error, "Could not determine delimiter" _csv.Error: Could not determine delimiter