Python откройте csv — документ с различными типами разделителей

#python #pandas #csv

Вопрос:

У меня есть текстовый документ со следующей структурой:

 1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537
 

Первое число с двоеточием-это индекс, и я не знаю, как его указать, когда открываю файл. Действительно, я хотел бы стереть его.
Затем данные разделяются запятыми и точками с запятой, и я хотел бы, чтобы каждое число было в другом столбце, независимо от того, является ли разделитель запятой или точкой с запятой.
Как я мог это сделать?

Комментарии:

1. Что вы используете для чтения csv-файла?

2. Я использую pd.read_csv

Ответ №1:

Используйте следующее для загрузки csv с помощью pd.read_csv:

 import pandas as pd

df = pd.read_csv("data.csv",  # the file path, change it to your filename 
                 sep="[,;:]",  # the separator use a regular expression
                 engine="python",  # need this to use regular expression as sep
                 usecols=range(1, 7),  # use columns from [1, 7)
                 header=None  # no header
                 )
print(df)
 

Выход

          1        2        3        4        5        6
0  0.84722  0.52855  0.65268  0.24792  0.66525  0.46562
1  0.84722  0.52855  0.65231  0.24513  0.66482  0.46548
2  0.84722  0.52855  0.65197  0.24387  0.66467  0.46537
 

Примечание
Как только вы загрузите файл, я советую сохранить его (используя to_csv) как правильный csv-файл.

Ответ №2:

Поскольку вы уже используете pandas.read_csv, просто ознакомьтесь с его документацией для аргументации sep :

Разделитель для использования. Если sep отсутствует, механизм C не может автоматически обнаружить разделитель, но механизм синтаксического анализа Python может, что означает, что последний будет использоваться и автоматически обнаружит разделитель с помощью встроенного средства поиска Python, csv.Sniffer. Кроме того, разделители длиной более 1 символа и отличные от «s » будут интерпретироваться как регулярные выражения, а также будут принудительно использовать механизм синтаксического анализа Python. Обратите внимание, что разделители регулярных выражений склонны игнорировать данные в кавычках. Пример регулярного выражения: ‘rt’.

Так что в вашем случае простого звонка pandas.read_csv(..., sep='[,;:]') должно хватить.

Ответ №3:

Сначала загрузите его как обычный текст (без анализатора csv). Удалите весь нежелательный текст, колумс … Замените обычные запятые точками с запятой.

Чтобы удалить первое число, вы можете разделить строку на : две части и оставить только вторую часть.

Чтобы заменить остальные, используйте replace(",", ";") .

Теперь у вас есть хороший файл .csv, который вы можете сразу прочитать и проанализировать.

Ответ №4:

Для использования нескольких разделителей вы можете передать regex шаблон, подобный :|,|; тому, который в основном говорит о любом из них.

За то, что вы не используете первый столбец — вы можете указать столбцы с usecols

engine="python" Спецификация необязательна, так как разделители длиной более 1 символа будут вынуждать использовать движок python.

 x = '''1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537'''
xf = io.StringIO(x)
df = pd.read_csv(xf, sep=":|,|;", engine='python', header=None, usecols=list(range(1, 7)))
print(df)
#         1        2        3        4        5        6
#0  0.84722  0.52855  0.65268  0.24792  0.66525  0.46562
#1  0.84722  0.52855  0.65231  0.24513  0.66482  0.46548
#2  0.84722  0.52855  0.65197  0.24387  0.66467  0.46537