Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2019 20:47:58

vesnushka.o
Зарегистрирован: 2019-05-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

Всем привет!
Очень нужна ваша помощь. Не могу понять в чем дело.
Суть:
у меня есть следующий список

 [[['A', 0, 0, 3], ['A', 9, 0, 3], ['A', 20, 0, 3], ['A', 29, 5, 2]], [['A', 0, 0, 3], ['A', 14, 5, 3], ['A', 26, 10, 3]], [['A', 0, 0, 3], ['A', 13, 10, 3], ['A', 24, 10, 3], ['A', 30, 10, 1]], [['C', 0, 0, 3], ['C', 9, 0, 3], ['C', 22, 0, 3], ['C', 25, 0, 1], ['C', 29, 5, 1]], [['A', 0, 0, 3], ['A', 11, 10, 3], ['A', 22, 10, 3], ['A', 32, 5, 2]], [['C', 0, 0, 3], ['C', 8, 5, 3], ['C', 21, 5, 3], ['C', 28, 5, 2]], [['C', 0, 0, 3], ['C', 9, 5, 3], ['C', 18, 5, 3], ['C', 27, 5, 1]], [['C', 0, 0, 3], ['C', 7, 5, 3], ['C', 21, 5, 3], ['C', 23, 0, 1], ['C', 25, 0, 1], ['C', 27, 5, 1]], [['A', 0, 0, 3], ['A', 12, 5, 3], ['A', 26, 10, 3]], [['C', 0, 0, 3], ['C', 14, 5, 3], ['C', 28, 10, 3]]]
Я его экспортирую в CSV файл, но когда открываю его, почему то появляются кавычки
 ['C', 0, 0, 3],"['C', 12, 0, 3]","['C', 23, 0, 3]","['C', 25, 0, 1]","['C', 33, 0, 1]"
И если на VBA я написала как избавиться от этих кавычек. то при импорте этого файла CSV на python, они все равно появляются!
 import csv #считываем данные из CSV
 
with open('s1.csv', "r", newline="") as file:
    reader = csv.reader(file)
    for row in reader:
        data = [row for row in reader]
print(data)
в следующем виде:
 [["['A', 0, 0, 3]", "['A', 14, 5, 3]", "['A', 26, 10, 3]"], ["['A', 0, 0, 3]", "['A', 13, 10, 3]", "['A', 24, 10, 3]", "['A', 30, 10, 1]"], ["['C', 0, 0, 3]", "['C', 9, 0, 3]", "['C', 22, 0, 3]", "['C', 25, 0, 1]", "['C', 29, 5, 1]"], ["['A', 0, 0, 3]", "['A', 11, 10, 3]", "['A', 22, 10, 3]", "['A', 32, 5, 2]"], ["['C', 0, 0, 3]", "['C', 8, 5, 3]", "['C', 21, 5, 3]", "['C', 28, 5, 2]"], ["['C', 0, 0, 3]", "['C', 9, 5, 3]", "['C', 18, 5, 3]", "['C', 27, 5, 1]"], ["['C', 0, 0, 3]", "['C', 7, 5, 3]", "['C', 21, 5, 3]", "['C', 23, 0, 1]", "['C', 25, 0, 1]", "['C', 27, 5, 1]"], ["['A', 0, 0, 3]", "['A', 12, 5, 3]", "['A', 26, 10, 3]"], ["['C', 0, 0, 3]", "['C', 14, 5, 3]", "['C', 28, 10, 3]"]]

Но мне нужно анализировать каждый маленький список, и эти кавычки мне мешают! Помогите, как мне от них избавиться?

Отредактировано vesnushka.o (Май 30, 2019 20:49:39)

Прикреплённый файлы:
attachment s1.csv (643 байта)

Офлайн

#2 Май 30, 2019 21:26:01

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Python и экспорт/испорт CSV файла

vesnushka.o
Я его экспортирую в CSV файл, но когда открываю его, почему то появляются кавычки
В прикрепленном файле сохранено просто текстовое представление списка (str), а не в формате csv. В csv выглядело бы примерно так:
 A, 0, 0, 3
A, 9, 0, 3
A, 20, 0, 3
...
А так именно считываются значения через разделитель (по умолчанию - запятая), все эти значения считываются как строки, строки всегда обрамлены кавычками. Т.е. первое из значений в формате csv:
 [[['A'

Офлайн

#3 Май 30, 2019 21:28:53

vesnushka.o
Зарегистрирован: 2019-05-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

Egorro13
Получается, что данный код не подходит для записи CSV?
 import csv #записываем данные в csv файл
with open('s1.csv', 'w+',newline='') as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(m.data)
csvFile.close()

Офлайн

#4 Май 30, 2019 21:43:24

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Python и экспорт/испорт CSV файла

vesnushka.o
Получается, что данный код не подходит для записи CSV?
Как я понимаю, метод writerows просто берет поочередно каждый элемент переданной последовательности (вложенный список) и пишет в файл его строковое представление, поэтому в файл и пишутся через запятую строки
 "['A', 0, 0, 3]","['A', 9, 0, 3]"...
При чтении через csv.reader эти значения в кавычках считываются также каждое как один элемент, хотя и содержат внутри запятые, т.е. разделители.

Как вариант, для такого многоуровневого списка можно использовать не csv, а json:
 import json
data = [[['A', 0, 0, 3], ['A', 9, 0, 3], ['A', 20, 0, 3], ['A', 29, 5, 2]],
        [['A', 0, 0, 3], ['A', 14, 5, 3], ['A', 26, 10, 3]],
        [['A', 0, 0, 3], ['A', 13, 10, 3], ['A', 24, 10, 3], ['A', 30, 10, 1]],
        [['C', 0, 0, 3], ['C', 9, 0, 3], ['C', 22, 0, 3], ['C', 25, 0, 1],
         ['C', 29, 5, 1]],
        [['A', 0, 0, 3], ['A', 11, 10, 3], ['A', 22, 10, 3], ['A', 32, 5, 2]],
        [['C', 0, 0, 3], ['C', 8, 5, 3], ['C', 21, 5, 3], ['C', 28, 5, 2]],
        [['C', 0, 0, 3], ['C', 9, 5, 3], ['C', 18, 5, 3], ['C', 27, 5, 1]],
        [['C', 0, 0, 3], ['C', 7, 5, 3], ['C', 21, 5, 3], ['C', 23, 0, 1],
         ['C', 25, 0, 1], ['C', 27, 5, 1]],
        [['A', 0, 0, 3], ['A', 12, 5, 3], ['A', 26, 10, 3]],
        [['C', 0, 0, 3], ['C', 14, 5, 3], ['C', 28, 10, 3]]]
with open('s1.json', 'w+') as f:
    f.write(json.dumps(data))
with open('s1.json', 'r') as f:
    new_data = json.load(f)
print(new_data)
print(data==new_data)

Отредактировано Egorro13 (Май 30, 2019 21:44:16)

Офлайн

#5 Май 30, 2019 21:52:42

vesnushka.o
Зарегистрирован: 2019-05-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

Egorro13
import json
спасибо большое за ответ

Офлайн

#6 Май 31, 2019 09:16:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

vesnushka.o
Прикреплённый файлы:
s1.csv
Запятые считаются разделителями полей в CSV. Чтобы проэкранировать запятые, нужно их заключить в двойные кавычки.

У тебя неправильный CSV-файл. Питон тут ни при чём.



Офлайн

#7 Май 31, 2019 09:50:38

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Python и экспорт/испорт CSV файла

Egorro13
Как я понимаю, метод writerows просто берет поочередно каждый элемент переданной последовательности (вложенный список) и пишет в файл его строковое представление, поэтому в файл и пишутся через запятую строки
Вчера вроде перед сном наступило то, что у алкоголиков называется просветлением: список 3-уровневый, получается что основной список содержит для writerows строки - вложенные списки, каждый такой список (т.е. строка в файле csv) содержит еще по 3-4 вложенных списка с 4 элементами каждый - эти списки и воспринимаются как значения и пишутся через запятую в кавычках. Хотя в прикрепленном файле этих кавычек почему-то нет, хотя выложенный код (“записываем данные в csv файл”) пишет именно в таком виде:
 "['A', 0, 0, 3]","['A', 9, 0, 3]","['A', 20, 0, 3]","['A', 29, 5, 2]"

Отредактировано Egorro13 (Май 31, 2019 09:51:17)

Прикреплённый файлы:
attachment s1.csv (723 байта)

Офлайн

#8 Май 31, 2019 11:24:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

Egorro13
пишет именно в таком виде:
Для этих полей можно делать eval(). То есть можно обойтись без смены формата с CSV на JSON, чтобы эти сохранённые данные обратно восстановить. Хотя всё равно сохранение данных в CSV в таком виде некорректно в общем случае (иногда специалисту может и понадобится такое, как goto или полный копипаст кода).



Отредактировано py.user.next (Май 31, 2019 11:26:11)

Офлайн

#9 Май 31, 2019 11:29:34

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Python и экспорт/испорт CSV файла

py.user.next
Для этих полей можно делать eval().
Спасибо, об eval вообще никаким боком еще не слышал)) Как бы еще запомнить, наверняка где-то пригодится

Офлайн

#10 Май 31, 2019 11:54:24

vesnushka.o
Зарегистрирован: 2019-05-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и экспорт/испорт CSV файла

py.user.next
спасибо, пыталась разобраться с eval(), но не понимаю где его применить

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version