Python CSV元组到列的列表

时间:2018-07-21 21:45:40

标签: python python-3.x list csv tuples

我有一个(x,y)元组的列表,既是它们的x和y列表,例如:

[
([44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676]
, [42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595])
]

主要思想是在此列表中有多个元组,仅出于示例目的使用了一个元组。

我需要将元组中的每个列表放入电子表格列,并使用以下代码进行操作:

def saveSpreadsheet(fpath, fname, list):
index = 1
for sublist in list:
    with open(os.path.join(fpath, fname + str(index) + '.csv'), 'w', newline='') as myfile:
        writer = csv.writer(myfile, delimiter=';')
        writer.writerow(("training","test"))
        for row in sublist:
            writer.writerow(row)
        index += 1

该方法采用文件夹路径,文件名和所述列表,并生成一个csv。我的问题是它不是保存在列中而是保存在行中:

enter image description here

假定的输出应如下所示:

enter image description here

我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

提供您的数据:

data = [
     (
        [44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676, 44.651162790697676],
        [42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595, 42.592592592592595]
     )
]

我们需要将其转换为可以逐行编写的内容。邮编效果很好:

for a in zip(data[0][0], data[0][1]):
    print(a)

导致的结果:

(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)
(44.651162790697676, 42.592592592592595)

我认为您在其他方面有很好的处理能力,可以对此进行调整。有关更多详细信息,请参见以下类似(重复的问题):Python: CSV write by column rather than row

评论中的建议都提供了很好的建议。如果不能保证列的长度相等,则可以使用itertools.zip_longest()。熊猫确实提供了更多的功能和更高的效率。但是不要过早优化。如果这满足了您的所有需求,并且您没有遇到任何问题,那么您可以避免这种情况。熊猫确实需要花费一些时间来学习,但是从长远来看,如果您会做更多的事情,这可能是值得的。

答案 1 :(得分:1)

尽管Zev提供了很大的帮助,但我最终还是遵循了Massoud Hosseinali的建议,并选择了熊猫,这更加有效和简洁。

与其具有像以前一样的列表的元组列表:[([],[])],如果我将它们的数据保存为包含元组的列表列表:[[(,)]],我可以简单地遍历每个子列表,将元组放入pd.Series,将其转换为pd.DataFrame,然后使用.csv保存为pd.to_csv

这是结果代码:

def saveSpreadsheet(fpath, fname, list):
index = 1
labels = ['training', 'test']
for sublist in list:
    training = pd.Series(sublist[0])
    test = pd.Series(sublist[1])
    df = pd.DataFrame({'training':training.values, 'test':test.values})
    df.to_csv(os.path.join(fpath, fname + str(index) + '.csv'), sep=";",  index=False)
    index += 1