Сохранить список списков в виде строк в csv-файле python

#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>