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

2024-10-02 04:23:54 发布

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

我必须从一个文件中读取,对于每个分隔符之间的数据,我需要删除空白,我已经用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()

所以我做了一些修改并添加了文件.seek所以我可以重写源代码行,它在某种程度上起到了一定的作用,只是在末尾添加了两行,这意味着seek部分有问题。在

修改后的程序是

^{pr2}$

请帮我弄清楚正确的逻辑。

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

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循环一起工作?


Tags: 文件thein程序fieldsforseek空白
3条回答

你正在重写,但是你的最终结果比原来的要短,所以你得到了原始版本的最后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()

这并不能回答您的问题,但您是否考虑过不使用jython?在

尝试使用Sed?在

你不想在读同一个文件时写入它。这在技术上是可能的,但这条路充满了麻烦和痛苦。在

以下是简单明了的流程:

  • 将整个文件读入字符串,然后关闭文件
  • 将换行符上的字符串拆分为一个列表
  • 处理每行以删除多余的间距
  • 将列表重新联接为字符串
  • 用新清理的数据覆盖源文件

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

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

我的建议是两种方式都写,看看哪些行有效或无效,哪种方式更快,而不是假设你不能仅仅因为它有数百万行就把它全部读入内存。也许它会很好的。在

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

相关问题 更多 >

    热门问题