如何在经过一定次数的迭代后创建新列表或新行

2024-06-15 23:20:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,我正在分析其中的一列数据,结果是一个大列表(50个元素):

CLB, HNRG, LPI, MTDR, MVO, NRGY, PSE, PVR, RRC, WES, ACMP, ATLS, ATW, BP, BWP, COG, DGAS, DNR, EPB, EPL, EXLP, NOV, OIS, PNRG, SEP, APL, ARP, CVX, DMLP, DRQ, DWSN, EC, ECA, FTI, GLOG, IMO, LINE, NFX, OILT, PNG, QRE, RGP, RRMS, SDRL, SNP, TLP, VNR, XOM, XTXI, AHGP

现在,在列表中每10个元素之后,我需要一个新行。因此,我认为处理方法是在每10个逗号将列表拆分为一行之后,我的方法如下:

^{pr2}$

但是它似乎不起作用,有没有人可以为我提供一个解决方案,在txt文件中给出这个结果:

CLB, HNRG, LPI, MTDR, MVO, NRGY, PSE, PVR, RRC, WES, 
ACMP, ATLS, ATW, BP, BWP, COG, DGAS, DNR, EPB, EPL, 
EXLP, NOV, OIS, PNRG, SEP, APL, ARP, CVX, DMLP, DRQ, 
DWSN, EC, ECA, FTI, GLOG, IMO, LINE, NFX, OILT, PNG, 
QRE, RGP, RRMS, SDRL, SNP, TLP, VNR, XOM, XTXI, AHGP

谢谢,顺便说一下,我正在使用python3。。在


Tags: 元素列表wespvrclbpserrcmtdr
3条回答

使用名为原始数据.txt看起来像这样:

CLB, HNRG, LPI, MTDR, MVO, NRGY, PSE, PVR, RRC, WES, ACMP, ATLS, ATW, BP, BWP, COG, DGAS, DNR, EPB, EPL, EXLP, NOV, OIS, PNRG, SEP, APL, ARP, CVX, DMLP, DRQ, DWSN, EC, ECA, FTI, GLOG, IMO, LINE, NFX, OILT, PNG, QRE, RGP, RRMS, SDRL, SNP, TLP, VNR, XOM, XTXI, AHGP

下面是一个脚本,它读取每一行并将其拆分为每行10个以上的符号

^{pr2}$

生成一个包含以下内容的文件:

CLB,HNRG,LPI,MTDR,MVO,NRGY,PSE,PVR,RRC,WES
ACMP,ATLS,ATW,BP,BWP,COG,DGAS,DNR,EPB,EPL
EXLP,NOV,OIS,PNRG,SEP,APL,ARP,CVX,DMLP,DRQ
DWSN,EC,ECA,FTI,GLOG,IMO,LINE,NFX,OILT,PNG
QRE,RGP,RRMS,SDRL,SNP,TLP,VNR,XOM,XTXI,AHGP

另一个选择是使用切片和xrange:

import csv
writer = csv.writer(open("output.txt", "w"))

for x in xrange(0,len(ticker_list),10):
    writer.writerow(ticker_list[x:x+10])

xrange给我们一个介于0和步长为10的列表长度之间的数字,然后我们打印出长度为10的片段,从这些指标开始到csvfilecsv.writer将负责添加逗号分隔符等

你可以这样做:

import csv
from itertools import izip_longest

with open('/tmp/line.csv','r') as fin:
    cr=csv.reader(fin)
    n=10
    data=izip_longest(*[iter(list(cr)[0])]*n,fillvalue='')
    print '\n'.join(', '.join(t) for t in data)

根据您的数据,打印:

^{pr2}$

编辑

澄清(Py 3)

我会这样写你的程序:

import csv
from itertools import zip_longest

n=10
with open('/tmp/rawdata.txt','r') as fin, open('/tmp/out.csv','w') as fout:
    reader=csv.reader(fin)
    writer=csv.writer(fout) 
    source=(e for line in reader for e in line)             
    for t in zip_longest(*[source]*n):
        writer.writerow(list(e for e in t if e))

更改:

  1. 输出到一个文件
  2. 元素的来源是一个发生器
  3. 无论每行有多少行或用逗号分隔的元素,源都是逐项处理的(取决于csv/元素的考虑)
  4. 无论n是什么,输出都是n个元素,直到最后一位<;n

相关问题 更多 >