为了账号安全,请及时绑定邮箱和手机立即绑定

在多行中将一个元组写入 CSV

在多行中将一个元组写入 CSV

慕桂英4014372 2021-08-17 18:21:40
所以,我有一个 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我想要做什么我想以一种方式组织这个元组,在每个 NO SYNC 之后它移动到下一行。100 0.01 11139155 5569534 0.499996 NO SYNC555 0.01 2306110 1153050 0.499998 NO SYNC333 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, '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')
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

这是您可能会处理此问题的一种方法的快速示例。


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

>>> 

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


查看完整回答
反对 回复 2021-08-17
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


这应该为将来提供可重复使用的功能,以防您遇到与此类似的另一个问题,这迫使您找到“NO SYNC”以外的其他内容。


就像@Rahul Chawla 的回答一样,这会查找您的新行标识符NO SYNC并将其更新为NOSYNC!. 这很有用的原因是,它为我们提供了一种创建以 结尾的条目列表的方法,NO SYNC每次我们看到!. 您可以根据数据中不存在的内容自定义将哪些分隔符(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'))

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


查看完整回答
反对 回复 2021-08-17
  • 3 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信