#python #csv
#питон #csv — файл #python #csv
Вопрос:
У меня есть список списков следующим образом:
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Я хочу сохранить это в CSV-файле следующим образом:
index, name, lists
0, 'name1', [1, 2, 3]
1, 'name2', [4, 5, 6]
2, 'name3', [7, 8, 9]
Если это возможно, то как я должен это сделать с помощью python?
Комментарии:
1. Вы читали документацию по модулю python
csv
? Что вы пробовали?2. @glibdud Нет, я не читал о модуле csv, но я попытался записать в файл с помощью python, и проблема в том, что если я преобразую подсписки в строку, то запятая между ними снова действует как разделитель и разделяет подсписок на большее количество столбцов. Я хочу, чтобы весь подсписок помещался в один столбец
3. Значение разделителя через запятую может быть неуместным в этом случае, потому что для синтаксического анализатора это немного неоднозначно, поскольку при чтении файла допустимый разделитель, а что нет.
t
Или символ табуляции может быть более подходящим4. Я думаю, что самым простым было бы пойти и создать pandas dataframe и загрузить в него свои данные, и с помощью функции to_csv вы можете записать это.
Ответ №1:
Вы можете использовать Pandas для объединения ваших данных во фрейм данных и простого вывода их в виде CSV-файла:
import pandas as pd
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
name = ['name1', 'name2', 'name3']
df = pd.DataFrame({'name': name, 'lists': L})
print(df)
df.to_csv('file.csv', index_label='index')
name lists
0 name1 [1, 2, 3]
1 name2 [4, 5, 6]
2 name3 [7, 8, 9]
Комментарии:
1. Когда я загружаю csv и получаю список типа
df['lists'][0]
, он возвращает список типа[1 2 3]
. Как я могу преобразовать это в список?2. Pandas не является идеальным инструментом для хранения списка списков. Похоже, что он импортирует текст в виде строки.
3. Вы можете преобразовать отдельные столбцы в список, подобный этому:
list(pd.eval(df['lists'][0]))
, который дает[1, 2, 3]
.4. Оказывается, я хранил массив numpy и преобразовывал его в список, а затем использовал
pd.eval()
, чтобы это сработало. Спасибо!
Ответ №2:
Если вы оставите kwargs по умолчанию для csv.writer, он распознает, что в строковом представлении списка есть запятые, и автоматически заключит его в кавычки для вас.
import csv
with open('filename.csv', 'w') as f:
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
fieldnames = ['index', 'name', 'lists']
writer = csv.writer(f)
writer.writerow(fieldnames)
for i, row in enumerate(L):
writer.writerow([str(i), 'name{}'.format(i), row])
Если вы посмотрите на filename.csv
, вы получите
index,name,lists
0,name_0,"[1, 2, 3]"
1,name_1,"[4, 5, 6]"
2,name_2,"[7, 8, 9]"
Ответ №3:
У вас на листе всего 3 строки, это правильно? Если да, то Pandas.DataFrame отлично подходит для решения этой проблемы.
#import pandas moudle first
import pandas as pd
#If you want to add `index` as the column name
index=[0,1,2]
name =['name 0','name 1','name 2']
#This is your original list in Python
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
#Using pd.DataFrame function to reformat the list into table
#Name the first column as 'index', the second column as 'name', and the last column as'lists'
table = pd.DataFrame({'index':index,
'name':name,
'lists':L})
#Write DataFrame to a comma-separated values (csv) file
table.to_csv('L.csv', index=False)
Если вы попытаетесь распечатать результат, он будет отображаться следующим образом (прошу прощения, я не знаю, как правильно внедрить таблицу)
<table>
<tr>
<td></td>
<td>index</td>
<td>name</td>
<td>list</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>name 1</td>
<td>[1, 2, 3]</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>name 2</td>
<td>[4, 5, 6]</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>name 3</td>
<td>[7, 8, 9]</td>
</tr>
</table>