需要的建议与重写和字符串操作有关

时间:2009-12-17 19:34:13

标签: python file rewrite jython

我必须从文件中读取并且对于分隔符之间的每个数据我需要删除空格并且我已经在jython中编写了以下程序

当我试图重写时,它在源文件末尾重写。

filesrc = open('c:/FILE/split_doc.txt','r+')
for list in filesrc.readlines():
    #split the records by the delimiter
    fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.writelines(list+"\n")

filesrc.close()

所以我做了一些修改并添加了file.seek所以我可以重写源代码行并且它在某种程度上工作,除了它在末尾添加两个额外的行,这意味着搜索部分的一些问题。

修改后的程序是

filesrc = open('c:/ODI_FILE/split_doc.txt','r+')
lines=0
for list in filesrc.readlines():
    #split the records by the delimiter
        fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.seek(lines)
    filesrc.writelines(list+"\n")
    lines += len(list+"\n")

filesrc.close()

请帮我正确理解。

带有额外空格的正确源文件

52       ,William   ,Kudo       ,28/03/199300:00:00
11,Andrew,      Andersen,22/02/199900:00:00
12,John        ,Galagers,20/04/200000:00:00
13,Jeffrey        ,Jeferson,10/06/198800:00:00
20,Jennie,Daumesnil,28/02/198800:00:00
21,Steve,Barrot,24/09/199200:00:00
22,Mary,Carlin,14/03/199500:00:00
30,Paul,Moore,11/03/199900:00:00

这是我错误的输出

52,William,Kudo,28/03/199300:00:00
11,Andrew,Andersen,22/02/199900:00:00
12,John,Galagers,20/04/200000:00:00
13,Jeffrey,Jeferson,10/06/198800:00:00
20,Jennie,Daumesnil,28/02/198800:00:00
21,Steve,Barrot,24/09/199200:00:00
22,Mary,Carlin,14/03/199500:00:00
30,Paul,Moore,11/03/199900:00:00
9500:00:00
30,Paul,Moore,11/03/199900:00:00

这里最后两行不应该来

请建议所需的更快的方法,因为这是一个示例文件,我必须让这个程序适用于数百万行。

是否有办法让这个逻辑也适用于while循环?

3 个答案:

答案 0 :(得分:1)

您不想在阅读时写入同一文件。这在技术上是可行的,但这条道路充满了麻烦和痛苦。

以下是您应遵循的简单明了的流程:

  • 将整个文件读入字符串然后关闭文件
  • 将换行符上的字符串拆分为列表
  • 处理每一行以消除额外的间距
  • 将列表重新加入字符串
  • 使用新清理的数据覆盖源文件

如果您不想立即将整个文件加载到内存中,请尝试以下过程:

  • 打开文件进行阅读
  • 逐行阅读
  • 将清理的行写入新的临时输出文件
  • 写入所有行时,删除原始文件
  • 将临时文件重命名为原始名称

我的建议是以两种方式编写它,看看哪些有效或无效,哪种方式更快,而不是假设你无法将它全部读入内存只是因为它是数百万行。也许它会运作得很好。

此外,你当然可以使用while循环来完成这项工作。为此,您需要以while循环的形式阅读Python文档并进行一些实验。如何编写该循环将取决于您如何加载文件:一次性加入一个字符串然后拆分成一个列表,或直接从文件中逐行。对于这两种情况,你怎么知道while循环必须做多少工作,你将如何从一件作品前进到另一件作品,你怎么知道它什么时候完成?如果你能回答这些问题,你可以写下你的循环。

答案 1 :(得分:0)

你正在覆盖,但是你的最终结果比原来短,所以你得到了原始流血的最后X个字符,其中X是从原始版本到新版本的大小差异。此版本中额外的.seek()和truncate()调用将寻找新输出的结尾并切断文件的其余部分。

filesrc = open('c:/ODI_FILE/split_doc.txt','r+')
lines=0
for list in filesrc.readlines():
    #split the records by the delimiter
        fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.seek(lines)
    filesrc.writelines(list+"\n")
    lines += len(list+"\n")
filesrc.seek(lines)
filesrc.truncate()
filesrc.close()

答案 2 :(得分:0)

这不能回答你的问题,但是你有没有考虑过用jython做这个?

尝试Sed