我想使用python将打印重定向到.txt文件.我有一个'for'循环,它会'打印'我的每个.bam文件的输出,而我想将所有这些输出重定向到一个文件.所以我试着把
f = open('output.txt','w'); sys.stdout = f
Run Code Online (Sandbox Code Playgroud)
在我的脚本开头.但是我在.txt文件中什么都没得到.我的脚本是:
#!/usr/bin/python
import os,sys
import subprocess
import glob
from os import path
f = open('output.txt','w')
sys.stdout = f
path= '/home/xug/nearline/bamfiles'
bamfiles = glob.glob(path + '/*.bam')
for bamfile in bamfiles:
filename = bamfile.split('/')[-1]
print 'Filename:', filename
samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
stdout=subprocess.PIPE,bufsize=1)
linelist= samtoolsin.stdout.readlines()
print 'Readlines finished!'
........print....
........print....
Run Code Online (Sandbox Code Playgroud)
所以有什么问题?除了这个sys.stdout之外的任何其他方式?
我需要我的结果如下:
Filename: ERR001268.bam
Readlines finished!
Mean: 233
SD: 10
Interval is: (213, 252)
Run Code Online (Sandbox Code Playgroud) 我正在运行以下python脚本:
#!/usr/bin/python
import os,sys
from scipy import stats
import numpy as np
f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
result=stats.ttest_ind(list1,list2)
print result[1]
Run Code Online (Sandbox Code Playgroud)
但是我得到的错误如下:
ValueError: could not convert string to float: id
Run Code Online (Sandbox Code Playgroud)
我很困惑.当我在交互式部分中只尝试一行时,而不是使用脚本循环:
>>> from scipy import stats
>>> import numpy as np
>>> f=open('data2.txt','r').readlines()
>>> w=f[1].split()
>>> l1=w[1:8]
>>> l2=w[8:15]
>>> list1=[float(x) for x in l1]
>>> list1
[5.3209183842, 4.6422726719, 4.3788135547, 5.9299061614, 5.9331108706, 5.0287087832, 4.57...]
Run Code Online (Sandbox Code Playgroud)
我运作良好.
任何人都可以解释一下吗?谢谢
对于某些列df
,如果列的80%是NAN
.
删除这些列的最简单的代码是什么?
嗨,我正在使用R进行直方图,但Y轴的数量是如此之大,我需要将其转换为对数.请参阅我的脚本下方:
hplot<-read.table("libl")
hplot
pdf("first_end")
hist(hplot$V1, breaks=24, xlim=c(0,250000000), ylim=c(0,2000000),main="first end mapping", xlab="Coordinates")
dev.off()
Run Code Online (Sandbox Code Playgroud)
那么我应该如何更改脚本?谢谢
我想每隔5秒逐行读取我的文件.这次我只尝试了单行bash命令来执行此操作.而bash命令是:
let X=1;while [ $X -lt 20 ];do cat XXX.file |head -$X|tail -1;X=$X+1;sleep 5;done
Run Code Online (Sandbox Code Playgroud)
但是我收到的错误如下:
-bash: [: 1+1: integer expression expected
Run Code Online (Sandbox Code Playgroud)
有什么问题?顺便说一句,为什么我们不能做X <20?(相反,我们必须做 - 小于?)
谢谢
最终我理解这一点,它的确有效.
bash脚本:
#!/bin/bash
#$ -V
#$ -cwd
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y
#$ -S /bin/bash
#$ -l mem_free=4G
c=$SGE_TASK_ID
cd /home/xxx/scratch/test/
FILENAME=`head -$c testlist|tail -1`
python testpython.py $FILENAME
Run Code Online (Sandbox Code Playgroud)
python脚本:
#!/bin/python
import sys,os
path='/home/xxx/scratch/test/'
name1=sys.argv[1]
job_id=os.path.join(path+name1)
f=open(job_id,'r').readlines()
print f[1]
Run Code Online (Sandbox Code Playgroud)
谢谢
我在尝试拆分大文件时遇到了一些麻烦(例如,大约10GB).基本思路是简单地读取行,并将每行分组,将40000行写入一个文件.但是有两种"阅读"文件的方式.
1)第一个是立即读取WHOLE文件,并将其变为LIST.但是这需要将WHOLE文件加载到内存中,这对于太大的文件来说是痛苦的.(我想之前我问过这样的问题)在python中,我尝试过读取WHOLE文件的方法包括:
input1=f.readlines()
input1 = commands.getoutput('zcat ' + file).splitlines(True)
input1 = subprocess.Popen(["cat",file],
stdout=subprocess.PIPE,bufsize=1)
Run Code Online (Sandbox Code Playgroud)
那么,我可以通过以下方式轻松地将40000行分组到一个文件中:list[40000,80000] or list[80000,120000]
或者使用列表的优点是我们可以轻松指向特定行.
2)第二种方式是逐行读取; 在阅读时处理该行.这些读取行不会保存在内存中.例子包括:
f=gzip.open(file)
for line in f: blablabla...
Run Code Online (Sandbox Code Playgroud)
要么
for line in fileinput.FileInput(fileName):
Run Code Online (Sandbox Code Playgroud)
我确定gzip.open,这个f不是列表,而是文件对象.似乎我们只能逐行处理; 那么我该如何执行这个"拆分"工作呢?如何指向文件对象的特定行?
谢谢
我需要列出大量文件(40,000个文件),如下所示:
ERR001268_1_100.fastq ERR001268_2_156.fastq ERR001753_2_78.fastq
ERR001268_1_101.fastq ERR001268_2_157.fastq ERR001753_2_79.fastq
ERR001268_1_102.fastq ERR001268_2_158.fastq ERR001753_2_7.fastq
ERR001268_1_103.fastq ERR001268_2_159.fastq ERR001753_2_80.fastq
Run Code Online (Sandbox Code Playgroud)
我的命令是:ls ERR*_1_*.fastq |sed 's/\.fastq//g'|sort -n > masterlist
但是错误是:bash: /bin/ls: Argument list too long
但是我可以解决这个问题吗?有没有其他方法可以通过perl/python制作这样的列表?
谢谢