Подсчитать количество столбцов в нескольких CSV-файлах в каталоге

1

У меня есть каталог, который содержит большое количество файлов 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))
Но проблема остается нерешенной. Я смог выяснить это после много осмотра, но каждый раз, когда я, возможно, не буду правильно догадываться, и это может привести к ошибке.
Любая помощь будет ожидаться.

  • 0
    Привет @Atif. Вы пытались запустить это без использования sep = вообще? Панды проделали довольно хорошую работу, разработав для вас разделитель. Итак ... «df = pd.read_csv (os.path.join (путь, файл), error_bad_lines = False, engine = 'python')»
  • 0
    @ChrisA, нет, это не работает. Это дает число столбцов как 1, хотя это не 1 для разделителя, имеющего "|"
Теги:
pandas
csv
python-3.x
python-2.7

1 ответ

1

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

  • 0
    Я пытался это, но я получаю сообщение об ошибке: raise Error, "Could not determine delimiter" _csv.Error: Could not determine delimiter
  • 0
    @Atif Можете ли вы добавить пару строк из файла CSV?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню