Python 将一个元组写入多行CSV

Python 将一个元组写入多行CSV,python,Python,所以,我有一个python元组。我正在尝试将其写入CSV文件。到目前为止,我所做的一切都可以写入CSV,但我的所有数据都显示在一行中。有人能告诉我如何将其转换为列吗?例如,这是我的CSV上一行中的数据 100 0.01 11139155 5569534 0.499996 NO SYNC 555 0.01 2306110 1153050 0.499998 NO SYNC 333 0.22 3434535 4446466 0.453535 NO SYNC 我想要做的是,我想要以一种方式组织这个元组

所以,我有一个python元组。我正在尝试将其写入CSV文件。到目前为止,我所做的一切都可以写入CSV,但我的所有数据都显示在一行中。有人能告诉我如何将其转换为列吗?例如,这是我的CSV上一行中的数据

100 0.01 11139155 5569534 0.499996 NO SYNC 555 0.01 2306110 1153050 0.499998 NO SYNC 333 0.22 3434535 4446466 0.453535 NO SYNC
我想要做的是,我想要以一种方式组织这个元组,在每次不同步之后,它会移动到下一行

100 0.01 11139155 5569534 0.499996 NO SYNC
555 0.01 2306110 1153050 0.499998 NO SYNC
333 0.22 3434535 4446466 0.453535 NO SYNC
这是我的剧本

with open ('File path') as f:
     writer = csv.writer(f, delimiter = ',')
     writer.writerow(results_t1)
f.close()
其中results_t1是我的输入元组

我的输入元组如下所示:


(100,0.01,11139155,5569534,0.499996094856387,'不同步',555,0.01,2306110,1153050,0.499997831846703,'不同步',3081,0.01,1951735,975863,0.499997694359122,'不同步',17100,0.01,2896740,1448360,0.4999965478438,'不同步',94912,0.01,1800105,900045,0.499995833576375,'不同步',526805,1690.01,1149595511,49903,“不同步”,2924018,0.01,22567451128371,0.49999935325879,“不同步”,16229682,0.01,2004625,1002304,0.4999957590545,“不同步”,90082412,0.01,1912945,956468,0.499997647606178,“不同步”,500000000,0.01,1421040,710518,0.499998592580082,“不同步”

假设CSV中的列数不变(通常是这样).而使用断块器是从一个令人垂涎的答案中得到的


这里有一个简单的例子,说明了一种可能的方法

>>> data = "1 2 3 4 5 6 7 8 9 10"
>>> items = data.split(" ")
>>> chunk_size = 5
>>> chunks = [items[i:i+chunk_size] for i in range(len(items)/chunk_size)]
>>> chunks
[['1', '2', '3', '4', '5'], ['2', '3', '4', '5', '6']]
>>> "\n".join([" ".join(chunk) for chunk in chunks])
'1 2 3 4 5\n2 3 4 5 6'
请注意,这里有一些不安全的假设。例如,我假设您的行的长度是一致的,您在开始时就知道

如果您的行的长度不一致,并且您希望在某个特定标记上断开,您可以这样做:

>>> data = "1 2 3 4 STOP 5 6 7 8 STOP"
>>> token = "STOP"
>>> chunks = data.split(token)
>>> "\n".join(["{} {}".format(chunk, token) for chunk in chunks])
'1 2 3 4  STOP\n 5 6 7 8  STOP\n STOP'
>>> 

显然,一旦你有了数据行,你就可以简单地将它们发送到一个文件。

我在这里的解决方案可能有点过火,但下面将为你提供你想要实现的输出

这将为将来提供一个可重用的功能,以防您遇到另一个类似的问题,迫使您查找“不同步”以外的内容

与@Rahul Chawla的答案类似,这会查找您的新行标识符
不同步
,并将其更新为
NOSYNC!
。这很有用的原因是,它为我们提供了一种创建以
不同步
结尾的条目列表的方法,每次看到
时都会拆分一个字符串。您可以自定义分隔符(
delim
参数,默认值为
)根据数据中不存在的内容附加到
find
参数

import csv

raw_data = (
100, 0.01, 11139155, 5569534, 0.499996094856387, 'NO SYNC', 555, 0.01, 2306110, 1153050, 0.499997831846703, 'NO SYNC',
3081, 0.01, 1951735, 975863, 0.499997694359122, 'NO SYNC', 17100, 0.01, 2896740, 1448360, 0.499996547843438, 'NO SYNC',
94912, 0.01, 1800105, 900045, 0.499995833576375, 'NO SYNC', 526805, 0.01, 2290245, 1145113, 0.499995851972169,
'NO SYNC', 2924018, 0.01, 2256745, 1128371, 0.499999335325879, 'NO SYNC', 16229682, 0.01, 2004625, 1002304,
0.49999575980545, 'NO SYNC', 90082412, 0.01, 1912945, 956468, 0.499997647606178, 'NO SYNC', 500000000, 0.01, 1421040,
710518, 0.499998592580082, 'NO SYNC')


def identify_new_rows(data, find, delim='!'):
    """convert a flat tuple/list, or string into a list of lists given something to `find`."""
    if isinstance(data, tuple):
        data = " ".join(map(str, data))
    elif isinstance(data, list):
        data = " ".join(data)
    data = [[x for x in d.split(' ') if str(x) != ''] for d in data.replace(find, str(find).replace(' ', '') + delim).split(delim) if len(d) > 0]
    return data



with open(r'~/path/to/your/file.csv', 'w', newline='') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL, delimiter=',')
    wr.writerows(identify_new_rows(raw_data, 'NO SYNC'))

我将注意到,在尝试应用于其他数据集时,这种方法存在缺陷,因为它假定数据中没有带空格的字符串(除了当前的分隔符-它在列表理解中得到处理。

您的输入元组是什么样子的?到目前为止您尝试了什么代码?您希望它以空格分隔而不是逗号分隔?(即,这是您希望写入文件的实际输出吗?)是的,这就是我要写入文件的内容,文件的“否”后面有一个新行SYNC@Omar-这些实现是否成功?我认为您需要使用open('File path','w)添加
as f:
我正在尝试你的技巧,但它给了我错误。因此,正如你在我更新的帖子中看到的,不同步是一个字符串。它给了我一个错误“tuple”对象没有属性“replace”。另外,你能告诉我你为什么使用$符号吗?@rs311谢谢你指出这一点,现在编辑了答案。Omar,在回答中添加了解释自己
import csv

raw_data = (
100, 0.01, 11139155, 5569534, 0.499996094856387, 'NO SYNC', 555, 0.01, 2306110, 1153050, 0.499997831846703, 'NO SYNC',
3081, 0.01, 1951735, 975863, 0.499997694359122, 'NO SYNC', 17100, 0.01, 2896740, 1448360, 0.499996547843438, 'NO SYNC',
94912, 0.01, 1800105, 900045, 0.499995833576375, 'NO SYNC', 526805, 0.01, 2290245, 1145113, 0.499995851972169,
'NO SYNC', 2924018, 0.01, 2256745, 1128371, 0.499999335325879, 'NO SYNC', 16229682, 0.01, 2004625, 1002304,
0.49999575980545, 'NO SYNC', 90082412, 0.01, 1912945, 956468, 0.499997647606178, 'NO SYNC', 500000000, 0.01, 1421040,
710518, 0.499998592580082, 'NO SYNC')


def identify_new_rows(data, find, delim='!'):
    """convert a flat tuple/list, or string into a list of lists given something to `find`."""
    if isinstance(data, tuple):
        data = " ".join(map(str, data))
    elif isinstance(data, list):
        data = " ".join(data)
    data = [[x for x in d.split(' ') if str(x) != ''] for d in data.replace(find, str(find).replace(' ', '') + delim).split(delim) if len(d) > 0]
    return data



with open(r'~/path/to/your/file.csv', 'w', newline='') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL, delimiter=',')
    wr.writerows(identify_new_rows(raw_data, 'NO SYNC'))