С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
3 / 2 / 1
Регистрация: 15.10.2019
Сообщений: 95

Распарсить строки в CSV файле

06.10.2021, 12:27. Показов 6486. Ответов 9

Студворк — интернет-сервис помощи студентам
Добрый день! У меня есть некоторый файл с расширением csv. В нём какая-то не совсем явная структура данных и стандартным методом pandas распарсить в лоб не удаётся.

Вот пример струткуры данных из файла csv:

PassengerId,Survived,Pclass,Name,Sex,Age ,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S

Метод использую следующий:

Python
1
data = pd.read_csv('1.csv', sep=',')
Вопрос как корректно отобразить и распарсить такую структуру данных? Может использовать другие библиотеки или как мне предложили отложить готовые решения и распарсить вручную (тут я затрудняюсь..)..

Как у меня открывается первые несколько строк - прикрепил по вложении.
Миниатюры
Распарсить строки в CSV файле  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2021, 12:27
Ответы с готовыми решениями:

Распарсить строки в кавычках в CSV файле
Добрый день! Подскажите, пожалуйста, столкнулся с проблемой: приходит файл в csv следующего вида: "Card...

Пустые строки в файле csv
Здравствуйте. Провожу запись в файл csv для последующей перезаписи в базу данных SQLite3. Код такой from bs4 import...

Переход строки в файле csv
Есть заполненный файл csv. К нему нужно первой строчкой добавить названия столбцов. Я делаю так: $file = 'table.csv'; ...

9
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
06.10.2021, 14:16
severe90,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array(['1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S'] + 11*[np.nan]).reshape(-1,1).T, columns='PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket, Fare,Cabin,Embarked'.split(','))
 
###############
# "Braund, Mr. Owen Harris" -> тут нужно ", " заменить на другой разделитель,
# если в других строках есть "имя" без запятых
df.iloc[:,0] = df.iloc[:,0].map(lambda x: str(x).replace(', ', ';'))
print(df)
 
df = pd.DataFrame(df['PassengerId'].map(lambda x: str(x).split(',')).values.tolist(), columns=df.columns.tolist())
###############
 
print(df)
0
3 / 2 / 1
Регистрация: 15.10.2019
Сообщений: 95
06.10.2021, 14:27  [ТС]
Дело в том, что если файл открыть в блокноте, то каждая строка кроме заголовка заключена в кавычки:

PassengerId,Survived,Pclass,Name,Sex,Age ,SibSp,Parch,Ticket,Fare,Cabin,Embarked
"1,0,3,""Braund, Mr. Owen Harris"",male,22,1,0,A/5 21171,7.25,,S"
"2,1,1,""Cumings, Mrs. John Bradley (Florence Briggs Thayer)"",female,38,1,0,PC 17599,71.2833,C85,C"
"3,1,3,""Heikkinen, Miss. Laina"",female,26,0,0,STON/O2. 3101282,7.925,,S"
"4,1,1,""Futrelle, Mrs. Jacques Heath (Lily May Peel)"",female,35,1,0,113803,53.1,C123,S "
"5,0,3,""Allen, Mr. William Henry"",male,35,0,0,373450,8.05,,S"
"6,0,3,""Moran, Mr. James"",male,,0,0,330877,8.4583,,Q"

Вот так. Значит как я понимаю, надо сначала считать каждую строку ну и как минимум удалить кавычки в начале и в конце каждой строке. Верно мыслю?
0
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
06.10.2021, 14:41
severe90, Да. Убрать кавычки в начале и конце каждой строки. И заменить запятую в поле "Name" или же добавить еще одно поле после "Name" (например "Name_"), а после создания df соединить эти столбцы в один...
0
3 / 2 / 1
Регистрация: 15.10.2019
Сообщений: 95
06.10.2021, 15:51  [ТС]
А тогда еще такой вопрос? Могу ли я тут считать все строки например так:

Python
1
2
3
4
with open('train.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
Тогда вывод будет такой:
['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']
['1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S']
['2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C']

Или в словарь:

Python
1
2
3
4
with open('train.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)
И тогда вывод такой:

{'PassengerId': '1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S', 'Survived': None, 'Pclass': None, 'Name': None, 'Sex': None, 'Age': None, 'SibSp': None, 'Parch': None, 'Ticket': None, 'Fare': None, 'Cabin': None, 'Embarked': None}


Какой-то из этих вариантов может мне облегчить задачу, например, перезаписыванием данных в новый csv файл, уже с корректным отображением структуры?

У меня много вопросов, и иногда может не совсем корректных, но путь к знаниям он такой..
0
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
06.10.2021, 17:07
severe90, скорректировать исходный train.csv можно так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import csv
 
res = []
with open('train.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        res.append(row)
 
# так как исходного файла нет,
# то скопировал у тебя спарсенные данные
# и "подогнал" под список res 
# эту строчку нужно убрать
res = [['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
 ['1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S'],
 ['2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C']]
#######
 
for i in range(1, len(res)):
    res[i] = res[i][0].strip("'").strip('"').replace(', ', '; ').split(',')
 
myFile = open('train.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(res)
Добавлено через 8 минут
Если структура файла, как в примерах:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import csv
 
res = []
with open('train.csv') as f:
    reader = csv.reader(f)
    k = True
    for row in reader:
        if k:
            row = row[0].strip("'").strip('"').replace(', ', '; ').split(',')
        res.append(row)
 
 
myFile = open('train.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(res)
0
3 / 2 / 1
Регистрация: 15.10.2019
Сообщений: 95
07.10.2021, 02:30  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
скорректировать исходный train.csv можно так

Да, результат получаестя верный в таком случае:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
res = []
with open('train.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        res.append(row)
res = [['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
 ['1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S'],
 ['2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C']]
 
for i in range(1, len(res)):
    res[i] = res[i][0].strip("'").strip('"').replace(', ', '; ').split(',')
 
myFile = open('train.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(res)
 
data = pd.read_csv('train.csv')
data.head()
Однако вот тут не совсем понял:

Цитата Сообщение от Gdez Посмотреть сообщение
# так как исходного файла нет,
# то скопировал у тебя спарсенные данные
# и "подогнал" под список res
# эту строчку нужно убрать
Как теперь обощить структуру на весь файл? Не копировать же мне все данные таким образом в код?
Миниатюры
Распарсить строки в CSV файле  
0
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
07.10.2021, 04:27
severe90, Если еще не изменял сам файл train.csv, попробуй
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import csv
 
res = []
with open('train.csv') as f:
    reader = csv.reader(f)
    k = False
    for row in reader:
        if k:
            row = row[0].strip("'").strip('"').replace(', ', '; ').split(',')
        res.append(row)
        k = True
 
myFile = open('train.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(res)
 
data = pd.read_csv('train.csv')
data.head()
0
3 / 2 / 1
Регистрация: 15.10.2019
Сообщений: 95
07.10.2021, 06:32  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
попробуй
Нет, в этом случае получается как на скриншоте.

Файл с расширением txt прикрепил.
Миниатюры
Распарсить строки в CSV файле  
Вложения
Тип файла: txt train (4).txt (19.8 Кб, 12 просмотров)
0
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
07.10.2021, 08:32
Лучший ответ Сообщение было отмечено severe90 как решение

Решение

severe90, скачал train (4).txt . Обработал
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import csv
 
res = []
with open('train1.txt') as f:
    lines = f.read().splitlines()
    for row in lines:
        row = row.replace(', ', '; ').split(',')
        res.append(row)
        
 
myFile = open('train1.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(res)
data = pd.read_csv('train1.csv')
Я пока только с айпада. На нем нет pandas -> попробуй сам. В csv "пишет" корректно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2021, 08:32
Помогаю со студенческими работами здесь

Удаление значения из строки в файле CSV
написал программу, по типу "окно входа на сайт" #!/usr/bin/env python3 import hashlib, csv name = input("Meno: ") ...

Распарсить файл csv
Здравствуйте, при считывании из файла csv в котором строки разделяются точкой с запятой, требуется чтобы от ; до ; должны быть слова...

Как распарсить csv файл
Первое - есть какой то самописный парсер Второе - родной фгетксв но вот дело такое выделил интересующие меня колонки родной...

Распарсить строку csv файла
Есть строки в файле разделенные пробелом Считываю в цикле fscanf(file,"%s%s%s%*c", val, val, val); Подскажите как, так же разобрать...

Как в исходном файле CSV удалить строки с "0" в ячейках?
Есть файл CSV нужно удалить строки с "0" в ячейках. Скриншот таблица.стар.jpg Есть код Скриншот код.jpg Получаем результат ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru