【问题标题】:Writing lines to a csv file in a for loop in python在python的for循环中将行写入csv文件
【发布时间】:2015-08-12 13:21:47
【问题描述】:

我有一个包含大约 5000 行的大型 csv 文件。 第一列包含每行的标识名称,即 LHGZZ01 前 9 行以 LHGZZ01 作为名称,接下来的 10 行具有其他名称,依此类推。 没有这样的模式,所以我使用 np.unique 来查找名称更改的索引。

我想编写一个循环,它将源 csv 的每一行写入新的 csv 文件,在循环中只包含相同的名称。

datafile = open('source.csv','rb')
reader = csv.reader(datafile)
data = []
idx = []
dataidx = []
next(reader, None)#skip headers
for row in reader:
    d = row[0]
    idx.append(d)
    data.append(row)
    dataidx.append(row[0])

index =np.sort(np.unique(idx,return_index=True)[1])

nme = []#list of unique names
for row in index:
    nm = data[row][0]
    nme.append(nm) 

for i in np.arange(0,9):
    with open(str(out_dir)+str(nme[0])+'.csv','w') as f1:
        row = data[i]
        writer=csv.writer(f1, delimiter=',')#lineterminator='\n',
        writer.writerow(row)

上面的代码写入新csv的第一行并停止。

我的问题是如何在每次新名称更改后循环通过 source.csv 文件拆分数据,然后将具有相同行名的行写入唯一的 csv?

为这个冗长的问题道歉,但不幸的是,这个问题超出了我的 python 技能,让我发疯了。

非常感谢任何帮助或建议

示例 csv:

Sample csv<br/>
ID  NORTH_DMS   EAST_DMS    DIST    <br/>
LHGZZ01 403921  374459  12500m  <br/>
LHGZZ01 403610  353000  12500m  <br/>
LHGZZ01 404640  360400  12500m  <br/>
LHGZZ01 404515  361900  12500m  <br/>
LHGZZ01 411240  381900  12500m  <br/>
LHGZZ01 415629  400600  12500m  <br/>
LHGZZ01 401503  384400  12500m  <br/>
LHGZZ01 400319  382200  12500m  <br/>
LHGZZ01 403921  372800  12500m  <br/>
LHGZZ02 412000  353200  12500m  <br/>
LHGZZ02 412749  343200  12500m  <br/>
LHGZZ02 403111  353000  12500m  <br/>
LHGZZ02 400600  374459  12500m  <br/>
LHGZZ02 401818  400600  12500m  <br/>
LHGZZ02 401525  393100  12500m  <br/>
LHGZZ02 401605  392400  12500m  <br/>
LHGZZ02 412000  384400  12500m  <br/>
LHGZZ02 372912  382157  8400m   <br/>
GPPHA01 381500  382200  8400m   <br/>
GPPHA01 393000  375252  8400m   <br/>
GPPHA01 395400  370602  8400m   <br/>
GPPHA01 401503  372912  8400m   <br/>
GPPHA01 400831  382157  8400m   <br/>
GPPHA01 390651  365700  8400m   <br/>
GPPHA01 372912  382954  8400m   <br/>
GPPHA02 392130  370602  12500m  <br/>
GPPHA02 400319  364000  12500m  <br/>
GPPHA02 400831  361900  12500m  <br/>
GPPHA02 390651  365700  12500m  <br/>
GPPHA02 382157  400600  12500m  <br/>
GPPHA02 382200  401818  12500m  <br/>
GPPHA02 375252  401525  12500m  <br/>
GPPHA02 385112  401605  12500m  <br/>
GPPHA02 392020  400319  12500m  <br/>
GPPHA02 392130  392130  12500m  <br/>
GPPHA03 392020  392020  9800m   <br/>
GPPHA03 385112  383000  9800m   <br/>
GPPHA03 382954  400600  9800m   <br/>
GPPHA03 365700  364000  9800m   <br/>
GPPHA03 381900  372912  9800m   <br/>
GPPHA03 383000  380700  9800m   <br/>
GPPHA03 392020  373724  9800m   <br/>
GPPHA03 385112  363842  7500m   <br/>
VVDFB01 374459  361210  12500m  <br/>
VVDFB01 353000  360002  12500m  <br/>
VVDFB01 360400  360002  12500m  <br/>
VVDFB01 361900  364000  12500m  <br/>
VVDFB01 381900  360002  12500m  <br/>
VVDFB01 400600  360002  12500m  <br/>
VVDFB01 384400  361210  12500m  <br/>
VVDFB01 382200  350530  12500m  <br/>
VVDFB02 372800  344400  12500m  <br/>
VVDFB02 353200  343100  12500m  <br/>
VVDFB02 343200  351448  12500m  <br/>
VVDFB02 353000  360002  12500m  <br/>
VVDFB02 374459  364000  12500m  <br/>
VVDFB02 400600  351448  12500m  <br/>
VVDFB02 393100  345353  12500m  <br/>
VVDFB02 392400  341731  12500m  <br/>

【问题讨论】:

  • 我想你已经把你的代码放了两次...(一眼看去是重复的)

标签: python loops csv for-loop writer


【解决方案1】:

每次以w 模式打开文件时,它都会覆盖那里的所有内容。您应该打开文件一次,然后循环调用writerow,例如:

with open(str(out_dir)+str(nme[0])+'.csv','w') as f1:
    writer=csv.writer(f1, delimiter=',')#lineterminator='\n',
    for i in np.arange(0,9):
        row = data[i]
        writer.writerow(row)

而不是通过for 循环每次迭代都重新打开文件

【讨论】:

  • 感谢您的回答。我在循环中打开文件以尝试将其合并到一个更大的循环中,这样我就可以在通过循环为每个具有新名称的 csv 文件进行一些迭代后打开一个新文件。不适合我。谢谢
【解决方案2】:

只是为了完成上面的问题。

我通过使用 w 属性打开/写入我需要的所有 csv 文件解决了我的问题(不是很优雅)。然后使用 a 属性在第二个 for 循环内附加每个 csv 文件。

感谢您的回答

干杯

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2018-03-14
    • 2017-11-30
    • 2019-07-20
    • 1970-01-01
    • 2013-08-28
    • 2016-09-30
    • 2019-01-25
    相关资源
    最近更新 更多