Подсчитать количество столбцов в нескольких CSV-файлах в каталоге - PullRequest
0 голосов
/ 25 августа 2018

У меня есть каталог, который содержит большое количество файлов CSV (более 1000). Я использую библиотеку Python Pandas для подсчета количества столбцов в каждом файле CSV.

Но проблема в том, что разделитель, используемый в некоторых файлах CSV, не только "," 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 sniffer идентифицирует разделитель для "|" как «е», поэтому, используя оператор if, я изменил его обратно на «|». Теперь он дает мне правильный вывод.
Также вместо read() я использовал readline(). в следующей строке кода в ответе Андрея: dialect = csv.Sniffer().sniff(csvfile.read(1024))
Но проблема остается нерешенной. Я смог выяснить это после большого количества проверок, но каждый раз я могу ошибаться, и это может привести к ошибке.
Любая помощь будет ждать.

1 Ответ

0 голосов
/ 25 августа 2018

Указав разделитель как 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 по умолчанию, так как он намного медленнее.

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