python - 在 python 的 for 循环中将行写入 csv 文件

标签 python loops csv for-loop writer

我有一个很大的 csv 文件,其中约有 5000 行。 第一列包含每行的标识名称,即 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/>

最佳答案

每次您以 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 循环每次迭代重新打开文件

关于python - 在 python 的 for 循环中将行写入 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533588/

相关文章:

r - 将 CSV 数据转换为矩阵到 R 中的热图

python - 将日期时间的时间部分转换为秒

python - 如何使用 curl 或请求捕获重定向

python - 如何打印出列表中以特定字母开头的元素

loops - Angular 2 - *ngFor : Is there a way to use an alternative end condition?

c++ - "return"没有从数组函数返回正确的值

python - spark中不同的读取选项有什么区别?

python - 如果我们可以直接使用变量而无需初始化,为什么我们在tensorflow中使用tf.Variable?

javascript - 如何遍历对象的所有属性并删除特定属性AngularJS

python - 如何将带有嵌套字典的列表写入 csv 文件?