如何在python中按id拆分文本文件

如何在python中按id拆分文本文件,python,Python,我有一堆包含制表符分隔表的文本文件。第二列包含一个id号,每个文件都已按该id号排序。我想按第2列中的id号将每个文件分隔为多个文件。这是我的 readpath = 'path-to-read-file' writepath = 'path-to-write-file' for filename in os.listdir(readpath): with open(readpath+filename, 'r') as fh: lines = fh.readlines

我有一堆包含制表符分隔表的文本文件。第二列包含一个id号,每个文件都已按该id号排序。我想按第2列中的id号将每个文件分隔为多个文件。这是我的

readpath = 'path-to-read-file'
writepath = 'path-to-write-file'
for filename in os.listdir(readpath):
     with open(readpath+filename, 'r') as fh:
          lines = fh.readlines()
     lastid = 0
     f = open(writepath+'checkme.txt', 'w')
     f.write(filename)
     for line in lines:
          thisid = line.split("\t")[1]
          if int(thisid) <> lastid:
               f.close()
               f = open(writepath+thisid+'-'+filename,'w')
               lastid = int(thisid)
          f.write(line)
     f.close()
在循环中只执行一次。有什么线索吗

编辑

问题是我的文件被用来\r\n而不是\r\n终止行。更正的代码(打开读取文件并交换!=for时只需添加“rU”):


如果您正在处理以制表符分隔的文件,那么您可以使用
csv
模块,并利用
itertools.groupby
将为您执行上一次/当前id跟踪这一事实。还可以使用
os.path.join
来确保文件名最终正确加入

未经测试:

import os
import csv
from itertools import groupby

readpath = 'path-to-read-file'
writepath = 'path-to-write-file'

for filename in os.listdir(readpath):
    with open(os.path.join(readpath, filename)) as fin:
        tabin = csv.reader(fin, delimiter='\t')
        for file_id, rows in groupby(tabin, lambda L: L[1]):
            with open(os.path.join(writepath, file_id + '-' + filename), 'w') as fout:
                tabout = csv.writer(fout, delimiter='\t')
                tabout.writerows(rows)

如果您正在处理以制表符分隔的文件,那么您可以使用
csv
模块,并利用
itertools.groupby
将为您执行上一次/当前id跟踪这一事实。还可以使用
os.path.join
来确保文件名最终正确加入

未经测试:

import os
import csv
from itertools import groupby

readpath = 'path-to-read-file'
writepath = 'path-to-write-file'

for filename in os.listdir(readpath):
    with open(os.path.join(readpath, filename)) as fin:
        tabin = csv.reader(fin, delimiter='\t')
        for file_id, rows in groupby(tabin, lambda L: L[1]):
            with open(os.path.join(writepath, file_id + '-' + filename), 'w') as fout:
                tabout = csv.writer(fout, delimiter='\t')
                tabout.writerows(rows)

您是否检查了循环中每次传递时实际计算的
int(thisid)
值,例如在
if
块之前添加
print(int(thisid))
?我刚刚将
f.write(line+'\r')
更改为
f.write(thisid+line+'\r'))
thisid仅出现在第一行。请注意:
在Python 3.x中被删除,即使2.x使用
,也被弃用=
相反,“thisid只出现在第一行”听起来像循环只执行了一次,整个文件都在
行中,所以在
readlines()
读入时它从来没有被拆分成单独的行-行终止符在某种程度上是非标准的吗?在
readlines()
之后,
line
包含多少元素?这是基本调试:-/@nekomatic谢谢。。。你让我走上了正确的道路。我试图转换的文件使用
\r
来标记行,而不是Python的readlines()所期望的
\r\n
。我只是在打开文件和阅读行时指定了
'rU'
,并用()识别它们。您是否检查了
int(thisid)
在循环中每次传递时实际计算的值,例如通过在
if
块之前添加
print(int(thisid))
,我只是将
f.write(line+'\r')
更改为
f.write(thisid+line+'\r')
thisid
仅出现在第一行。请注意:
在Python 3.x中被删除,即使2.x-使用
!=
也被弃用,“thisid仅出现在第一行”在我看来,循环只执行一次,而整个文件都在
行中,因此当
readlines()读入时,它从未被拆分为单独的行。
-行终止符在某种程度上是否不标准?在
readlines()之后包含多少元素
?这是基本调试:-/@nekomatic谢谢…你让我走上了正确的轨道。我试图转换的文件使用
\r
来标记行,而不是Python的readlines()所期望的
\r\n
。在打开文件和readlines()时,我只是指定了
'rU'
识别它们似乎是一种方法。但在某些地方似乎是个问题。@Joseph如果在某个时候你想分享它-它可能会有用:p用我的原始代码发现问题…我试图转换的文件使用
\r
标记行,而不是
\r\n
Python的readlines()需要。我只是在打开文件时指定了
'rU'
,而readlines()识别了它们。我刚刚测试了您的解决方案,在打开读取文件时添加了
,'rU'
。您的解决方案有效…唯一的问题是它在每行之间添加了一个空行。如果不是这样的话(应该很容易修复)但是,你可以尝试在 WB模式中打开输出文件,但是,这应该会减轻空白行的样子。虽然在某些地方似乎是个问题。-这可能很有用:p找到我的原始代码的问题…我试图转换的文件使用
\r
来标记行,而不是Python的readlines()所期望的
\r\n
。我在打开文件和readlines()时只指定了
'rU'
)我刚刚测试了你的解决方案,在打开读取文件时添加了
,“rU”
。你的解决方案有效…唯一的问题是它在每行之间添加了一个空行。如果不是因为这个(应该很容易修复)“我希望你的代码更好。”Joseph Sadyy>代码> CSV。Reader 总是忽略<代码> LimeTimeAuth/Cuth>选项-你可以尝试打开输出文件在 WB< /Calp>模式-但是应该减轻空白行。
import os
import csv
from itertools import groupby

readpath = 'path-to-read-file'
writepath = 'path-to-write-file'

for filename in os.listdir(readpath):
    with open(os.path.join(readpath, filename)) as fin:
        tabin = csv.reader(fin, delimiter='\t')
        for file_id, rows in groupby(tabin, lambda L: L[1]):
            with open(os.path.join(writepath, file_id + '-' + filename), 'w') as fout:
                tabout = csv.writer(fout, delimiter='\t')
                tabout.writerows(rows)