Строка списков (вероятно) в файл csv python

Следуя моему предыдущему вопросу, потому что я не мог получить удовлетворительный ответ. Теперь у меня есть такие данные, не знаю, что именно

["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]

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

A        ,B    ,C
a1,a2    ,b1   ,c1
a2,a4    ,b3   ,ct

person abn    schedule 24.11.2014    source источник
comment
Я получаю сообщение об ошибке при попытке установить значение, равное ["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"], вы имеете в виду --› ['A','B','C']['a1,a2','b1','c1']['a2,a4','b3','ct'] ?   -  person Jay    schedule 24.11.2014
comment
@Jay Нет. У него есть как одинарные, так и двойные кавычки.   -  person abn    schedule 24.11.2014
comment
как струна? например --› "["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]" ? Потому что вы не можете установить переменную для этого, т.е. a = ["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]   -  person Jay    schedule 24.11.2014
comment
@Jay Это именно то, как я написал в вопросе выше. ["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"] Я понятия не имею, что это может быть. Я сделал mydata = [mydata.replace("|", "")[1:-1]], потому что мне нужно было заменить символы |, которые были у меня в данных. Все это определенно является строкой.   -  person abn    schedule 24.11.2014


Ответы (3)


Предполагая, что ["'A','B','C'"]["'a1,a2','b1','c1'"]["a2,a4','b3','ct'" ] - это одна длинная строка, как, кажется, подразумевает исходный пост, то есть:

"""["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]""" 

тогда должен работать следующий код:

# ORIGINAL STRING
s = """["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]"""

# GET RID OF UNNECESSARY CHARACTERS FOR OUR CSV
s = s.replace("][", "--") # temporary chars to help split into lines later on
s = s.replace("[", "")
s = s.replace("]", "")
s = s.replace("\'", "")
s = s.replace("\"", "")

# SPLIT UP INTO A LIST OF LINES OF TEXT
lines = s.split("--")

# WRITE EACH LINE IN TURN TO A CSV FILE
with open("myFile.csv", mode = "w") as textFile:
    # mode = w     to override any other contents of an existing file, or 
    #              create a new one.
    # mode = a       To append to an exising file
    for line in lines:
      textFile.write(line + str("\n"))
person ronrest    schedule 24.11.2014

Альтернативный способ, опять же предполагающий, что данные закодированы как одна длинная строка:

import ast

# ORIGINAL STRING
s = """["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]"""

# PARSE INTO A LIST OF LISTS WITH STRING ELEMENTS
s2 = s.replace("][", "],[")
s2 = ast.literal_eval(s2)
s2 = [ast.literal_eval(s2[x][0]) for x in range(len(s2))]

# WRITE EACH LIST AS A LINE IN THE CSV FILE                     
with open("myFile.csv", mode = "w") as textFile:
        # mode = w     to override any other contents of an existing file, or 
        #              create a new one.
        # mode = a       To append to an exising file
        for i in range(len(s2)):
          line = ",".join(s2[i])
          textFile.write(line + str("\n"))
person ronrest    schedule 24.11.2014

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

#!/usr/bin/python

from ast import literal_eval

def csv(li):
    file_handle = open("test.csv", "w")
    #stripping the outer double_quotes and splitting the list by commas
    for outer in li:
        temp = outer[0].strip("'")
        temp = temp.split("',")
        value = ""
        #bulding a formatted string(change this as per your requirement
        for inner in temp:
            value += '{0: <10}'.format(inner.strip("'")) + '{0: >10}'.format(",")
        value = value.strip(", ")
        #writing the built string into the file
        file_handle.write(value + "\n")
    file_handle.close()

#assuming your input as string
def main():
    li_str = """["'A','B','C'"]["'a1,a2','b1','c1'"]["'a2,a4','b3','ct'"]"""
    li = []
    start_pos, end_pos = 0, -1
    #break each into a new list and appending it to li
    while(start_pos != -1):
        start_pos = li_str.find("[", end_pos+1)
        if start_pos == -1:
            break
        end_pos = li_str.find("]", start_pos+1)
        li.append(literal_eval(li_str[start_pos:end_pos+1]))
    #li now conatins a list of lists i.e. same as the input
    csv(li)

if __name__=="__main__":
    main()
person sid1408    schedule 24.11.2014