【问题标题】:writing output in the csv format from dictionary从字典中以 csv 格式写入输出
【发布时间】:2014-08-14 18:18:57
【问题描述】:

能否请我就如何将我的输出写入制表符分隔格式获得建议?我正在将 csv 文件与字典进行比较。这是我的代码(这是我有问题的代码的结尾):

import csv

file3 = open(r'file.csv','rt', newline = '')
baits = csv.reader(file3, delimiter = '\t')

file4 = open(r'file.txt','wt', newline = '')
common = csv.writer(file4, delimiter = '\t')

for line in baits:
    chromosome = line[0]
    start = int(line[1])
    end = int(line[2])
    if chromosome in dmc:
        for value in dmc[chromosome]:
            base = value[0]
            others = value[1:]
            if base >= start and base <= end:
                count_in += 1
                common.writerow(line + [base, others])

file3.close()
file4.close()

这是我的输出示例:

chr1    3505353 3505472 3505390 (['3505390', '-', '3.32682966730502e-08', '1.69470366570212e-07', '-35.4239256678281', '1', '156190', 'NM_001011874', '-'],)                                        
chr1    3601312 3601671 3601347 (['3601347', '-', '1.94815734655407e-08', '1.01925267518696e-07', '-40.8010680907877', '2', '60233', 'NM_001011874', '-'],)                                     

我在尝试摆脱大括号和 '' 时遇到问题,以便大括号中的每个值都是制表符分隔的。

有人知道可以修改代码来实现吗?

谢谢!

【问题讨论】:

  • 你的代码中 file3 和 file4 的意义何在?您没有在数据处理器中使用任何一个。 DMR_DMC 是您的输出文件吗?如果是这样,它是否引用了csv.writer 对象?
  • 对不起。那是一个错字。
  • 如果你不能向我们展示一个包含完整数据的MCVE,你至少可以做一个print(repr(line), repr(value)) 并给我们一个例子,这样我们就知道你想要输出什么类型和它们采用什么格式?
  • 如果知道dmc 字典中的值是什么——列表、元组?

标签: python csv dictionary output


【解决方案1】:

如果不在这里看到您的数据很难判断,但我猜它看起来像这样:

line = ['chr', 3505353, 3505472]
base = 3505390
others = (['3505390', '-', '3.32682966730502e-08', '1.69470366570212e-07', '-35.4239256678281', '1', '156190', 'NM_001011874', '-'],)

如果是这样,line + [base, others] 将是:

['chr', 3505353, 3505472, 3505390,  (['3505390', '-', '3.32682966730502e-08', '1.69470366570212e-07', '-35.4239256678281', '1', '156190', 'NM_001011874', '-'],)]

换句话说,五列,其中最后一个是一个元组,其中包含一个包含一堆值的列表。

我不确切知道您想要什么输出,但我假设该元组中的每个列表都意味着一个新行,而该列表只是一堆额外的列。在这种情况下:

if base >= start and base <= end:
    count_in += 1
    for other in others:
        common.writerow(line + [base] + others)

这会给你一个看起来像这样的行:

chr1    3505353 3505472 3505390 3505390 - 3.32682966730502e-08 1.69470366570212e-07 -35.4239256678281 1 156190 NM_001011874 -

无论如何,获得所需输出的唯一方法是获取列值列表。而且调试正确的列表要容易得多。尝试打印出这些碎片,然后计算出将这些碎片放在一个平面列表中需要做的事情。一旦你有了它,你就完成了。

【讨论】:

  • 谢谢。我回去尝试了一些打印出来的东西。终于解决了!谢谢你的帮助。你的假设是正确的
【解决方案2】:

我猜——因为你的问题缺少很多信息——你需要改变这一行:

            common.writerow(line + [base, others])

到这里:

            common.writerow(line + list(value))

另外,csvfiles 应该以'rb''wb'的模式打开。

【讨论】:

  • 此代码不起作用,因为 DMR_DMC.writerow 只接受一个参数。 DMR_DMC.writerow(line + value) 有两个参数。回溯(最后一次调用):文件“F:/MethylKit output/Cortex_vs_Liver/Bait_DMC_merge.py”,第 46 行,在 DMR_DMC.writerow(line + value) TypeError: can only concatenate list (not "tuple")列出
  • @user3302763:你说得对,它不起作用,但这不是问题。 line + value 仍然是一个论点;这不是一个合法的论点,因为您要添加一个列表 (line) 和一个元组 (value)。你可以通过line + list(value) 来解决这个问题。 (我不知道这是否是您真正想要的,但它至少不会引发该异常。)
猜你喜欢
  • 2015-10-04
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多