小编Sty*_*ize的帖子

将多个CSV文件中的列合并为一个文件

我有一堆CSV文件(下面的例子中只有两个).每个CSV文件有6列.我想进入每个CSV文件,复制前两列并将它们作为新列添加到现有CSV文件中.

到目前为止,我有:

import csv

f = open('combined.csv')
data = [item for item in csv.reader(f)]
f.close()

for x in range(1,3): #example has 2 csv files, this will be automated
    n=0
    while n<2:
        f=open(str(x)+".csv")
        new_column=[item[n] for item in csv.reader(f)]
        f.close()
        #print d

        new_data = []

        for i, item in enumerate(data):
            try:
                item.append(new_column[i])
                print i
            except IndexError, e:
                item.append("")
            new_data.append(item)

        f = open('combined.csv', 'w')
        csv.writer(f).writerows(new_data)
        f.close()
        n=n+1
Run Code Online (Sandbox Code Playgroud)

这是有效的,它不漂亮,但它的工作原理.但是,我有三个小烦恼:

  1. 我打开每个CSV文件两次(每列一次),这很不优雅

  2. 当我打印combined.csv文件时,它会在每行后打印一个空行?

  3. 我必须提供一个combined.csv文件,其中至少包含与我可能拥有的最大文件一样多的行.由于我真的不知道这个数字是什么,这有点糟透了

一如既往,非常感谢任何帮助!

根据要求:1.csv看起来像(模拟数据)

1,a
2,b
3,c
4,d
Run Code Online (Sandbox Code Playgroud)

2.csv看起来像

5,e …
Run Code Online (Sandbox Code Playgroud)

python csv

13
推荐指数
2
解决办法
2万
查看次数

为什么python不再等待os.system完成?

我有以下功能,几个月来一直很好用.我没有更新我的Python版本(除非它发生在幕后?).

def Blast(type, protein_sequence, start, end, genomic_sequence):
    result = []
    M = re.search('M', protein_sequence)
    if M:
        query = protein_sequence[M.start():]
        temp = open("temp.ORF", "w")
        print >>temp, '>blasting'
        print >>temp, query
        temp.close()
        cline = blastp(query="'temp.ORF'", db="DB.blast.txt",
                       evalue=0.01, outfmt=5, out=type + ".BLAST")
        os.system(str(cline))
        blast_out = open(type + ".BLAST")
        string = str(blast_out.read())
        DEF = re.search("<Hit_def>((E|L)\d)</Hit_def>", string)
Run Code Online (Sandbox Code Playgroud)

我收到blast_out=open(type+".BLAST")无法找到指定文件的错误.此文件作为os.system调用调用的程序输出的一部分创建.这通常需要大约30秒才能完成.但是,当我尝试运行程序时,它立即给出了我上面提到的错误.

我以为os.system()应该等待完成?
我应该以某种方式强迫等待吗?(我不想硬编码等待时间).

编辑:我已经在BLAST程序的命令行版本中运行了cline输出.一切似乎都很好.

python os.system

7
推荐指数
2
解决办法
3万
查看次数

为什么subprocess stdout到文件是按顺序写的?

我有一个调用可执行文件的python脚本.可执行文件的输出被重定向到日志文件以及有关其被调用时间的一些信息.例如,使用python -V可执行文件来说明:

import time, subprocess
with open('./LOGFILE.txt', 'a') as F:
    F.write('******\n')
    F.write('Events on %s :\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    EXE_output = subprocess.call(['python', '-V'], stdout=F, stderr=F)
Run Code Online (Sandbox Code Playgroud)

该文件的输出LOGFILE.txt是:

Python 2.7.3
******
Events on 2013-04-10 19:27:25 :
Run Code Online (Sandbox Code Playgroud)

我期待的地方如下:

******
Events on 2013-04-10 19:27:25 :
Python 2.7.3
Run Code Online (Sandbox Code Playgroud)

******在运行子进程并将其输出和错误重定向到文件之前,我在打开的日志文件中编写了时间信息.为什么这样订购?我该如何重新排序?

python redirect subprocess

7
推荐指数
1
解决办法
1352
查看次数

重新编号蛋白质结构文件中的残基(pdb)

您好
我目前正在参与制作一个旨在将所有乳头状瘤病毒信息整合在一个地方的网站.作为努力的一部分,我们正在策划公共服务器上的所有已知文件(例如genbank)我遇到的一个问题是所有解决的结构中的许多(约50%)没有根据蛋白质编号.即子结构域结晶(氨基酸310-450),然而结晶学家将其沉积为残留物1-140.我想知道是否有人知道重新编号整个pdb文件的方法.我已经找到了重新编号序列的方法(由seqres标识),但是这不会更新螺旋和工作表信息.如果您有任何建议我会很感激...
谢谢

python biopython

5
推荐指数
2
解决办法
4192
查看次数

如何根据文本节点的值添加xml节点

我正在玩一个 xml 文件@ http://www.jsphylosvg.com/examples/source.php?example=2&t=xml

如果 node 的值,我想插入一个节点name="Espresso"

例如,我想从:

<clade>
<name>Espresso</name>
<branch_length>2.0</branch_length>
</clade>
Run Code Online (Sandbox Code Playgroud)

到:

<clade>
<name>Espresso</name>
<url>www.espresso.com</url>
<branch_length>2.0</branch_length>
</clade>
Run Code Online (Sandbox Code Playgroud)

根据我迄今为止所做的研究,我可以xpath用来查找包含 espresso 的节点(这应该有效,但它没有?)

import re, sys
import lxml.etree
f = open("test.xml", "r")
data = f.read()
tree = lxml.etree.XML(data)
if tree.xpath('//name/text()="Espresso"'):
    insert new child here
Run Code Online (Sandbox Code Playgroud)

此时应该可以使用uselxml.etree.Element来制作xml节点,并使用insert将它们附加到xml文档中

然而,虽然这在理论上听起来很棒,但我无法让它发挥作用。
我真的很感激任何帮助/建议

python xml xpath lxml

5
推荐指数
1
解决办法
1393
查看次数

在python中:两个列表之间的差异

我有两个这样的清单

found = ['CG', 'E6', 'E1', 'E2', 'E4', 'L2', 'E7', 'E5', 'L1', 'E2BS', 'E2BS', 'E2BS', 'E2', 'E1^E4', 'E5']
expected = ['E1', 'E2', 'E4', 'E1^E4', 'E6', 'E7', 'L1', 'L2', 'CG', 'E2BS', 'E3']
Run Code Online (Sandbox Code Playgroud)

我想找到两个列表之间的差异.
我已经做好了

list(set(expected)-set(found))
Run Code Online (Sandbox Code Playgroud)

list(set(found)-set(expected))
Run Code Online (Sandbox Code Playgroud)

返回['E3']['E5']分别.

但是,我需要的答案是:

'E3' is missing from found.
'E5' is missing from expected.
There are 2 copies of 'E5' in found.
There are 3 copies of 'E2BS' in found.
There are 2 copies of 'E2' in found.
Run Code Online (Sandbox Code Playgroud)

欢迎任何帮助/建议!

python compare list

5
推荐指数
1
解决办法
9741
查看次数

matplotlib:轴的比例不正确

我有一个看起来像这样的csv文件:

Axis [m],Channel 1 [],Channel 2 [],Channel 3 [],Channel 4 []
0,11.87772978,65.2269997,7.103221875,6.324708559
1.34E-08,17.65605321,75.09093444,8.309697828,14.87524308
2.69E-08,15.19155521,77.12878487,12.31291774,9.457125362
4.03E-08,23.85118853,88.76138941,20.10571063,8.041540228
5.38E-08,18.77440037,87.15681445,14.53884458,13.36609689
6.72E-08,19.54841939,117.9766076,16.87197928,18.50902666
8.06E-08,33.37595782,102.2086995,40.59474863,9.451430137
Run Code Online (Sandbox Code Playgroud)

我想使用matplotlib绘制前两列中的值

我有以下代码:

import matplotlib.pyplot as plt
import pylab, csv

x=[]
y=[]
with open("test.csv","rU") as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
                if re.search("\d",row[0]):
                    x.append(float(row[0]))
                    y.append(float(row[1]))
fig = plt.figure()
ax1 = fig.add_subplot(121)

ax1.scatter(x,y,color='blue',s=5,edgecolor='none')
ax1.set_aspect(1./ax1.get_data_ratio()) # make axes square

pylab.savefig('test.jpg')
Run Code Online (Sandbox Code Playgroud)

但是,这会绘制我所有的x值(总共122个值),作为0左右的线(不像我期望的那样曲线),这里看一个例子.我认为这是因为x轴的比例是将所有数据聚集在0左右.我想我需要改变x轴的比例来处理小数?
任何帮助,一如既往,将受到高度赞赏!

python matplotlib

3
推荐指数
1
解决办法
8205
查看次数

使用lxml,如何找到父节点的兄弟节点?

XML不断抛弃曲线球.我很难找到一本我能理解的手册.所以我为过去几天的所有问题道歉.

无论如何,我有以下XML:

      <clade>
        <clade>
          <branch_length>0.5</branch_length>
          <clade>
            <name>MnPV1</name>
            <annotation>
<desc>Iotapapillomavirus 1</desc></annotation><chart><group>Iota</group></chart><branch_length>1.0</branch_length>
          </clade>
          <clade> 
Run Code Online (Sandbox Code Playgroud)

我想将此更改为:

  <clade>
    <clade>
      <branch_length>0.5</branch_length>
      <clade>
        <name bgstyle="green">MnPV1</name>
        <annotation><desc>Iotapapillomavirus 1</desc><uri>http://pave.niaid.nih.gov/#fetch?id=MnPV1REF&amp;format=Locus%20view&amp;hasStructure=none</uri></annotation><chart><group>Iota</group></chart><branch_length>1.0</branch_length>
      </clade>
      <clade>
Run Code Online (Sandbox Code Playgroud)

所以我想改变:

<name>MnPV1</name>
Run Code Online (Sandbox Code Playgroud)

至:

<name bgstyle="green">MnPV1</name>
Run Code Online (Sandbox Code Playgroud)

问题是,我正在寻找是否:

tree.xpath('//phylo:group[text()="Iota"]
Run Code Online (Sandbox Code Playgroud)

如果它是我想得到"组"节点的"叔叔",所以我可以编辑"名称"节点

这是我到目前为止提出的:

tree = lxml.etree.XML(data)
nsmap = {'phylo': 'http://www.phyloxml.org'}
matches = tree.xpath('//phylo:group[text()="Iota"]', namespaces=nsmap)
Run Code Online (Sandbox Code Playgroud)
for e in matches:
    uncle=e.getparent().getsibling() #however, getsibling() does not exist...
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助(和/或lxml for dummies的建议).

python xml xpath lxml

2
推荐指数
1
解决办法
2042
查看次数

Python:连接包含特定字符串的行

我想在文件中加入两行,基于它们是否以相同的元素开头.
我可以将每行的第一个元素转换为列表,并使用此列表中的元素来搜索每一行,但这似乎不是最有效的方法吗?

我有以下文件

1,AF534061.1,T,A  
1,K02718.1,T,A  
16,AF534061.1,G,-  
16,K02718.1,G,-  
17,AF534061.1,T,-  
17,K02718.1,T,-  
18,AF534061.1,A,-  
18,K02718.1,A,-  
19,AF534061.1,T,-  
19,K02718.1,T,-  
20,AF534061.1,A,-  
20,K02718.1,A,-  
21,AF534061.1,A,-   
21,K02718.1,A,-  
24,AF534061.1,C,T   
Run Code Online (Sandbox Code Playgroud)

如果第一项在行之间共享,我想加入行.所以我想获得以下输出

1,AF534061.1,T,A,1,K02718.1,T,A
16,AF534061.1,G,-,16,K02718.1,G,-
17,AF534061.1,T,-,17,K02718.1,T,-
18,AF534061.1,A,-,18,K02718.1,A,-
19,AF534061.1,T,-,19,K02718.1,T,-
20,AF534061.1,A,-,20,K02718.1,A,-
21,AF534061.1,A,-,21,K02718.1,A,-
24,AF534061.1,C,T
Run Code Online (Sandbox Code Playgroud)

在这个例子中,看起来我可能只能加入其他每一行,但我希望(需要)使代码更通用!

我不认为这很难,但我似乎无法弄明白!谢谢您的帮助

python join

0
推荐指数
1
解决办法
946
查看次数

标签 统计

python ×9

lxml ×2

xml ×2

xpath ×2

biopython ×1

compare ×1

csv ×1

join ×1

list ×1

matplotlib ×1

os.system ×1

redirect ×1

subprocess ×1