任务
我在python中编写一个程序,通过每次导入一个新的.s2k文件来运行SAP2000程序进入Sap2000程序,然后通过导出数据从前一次运行的结果生成一个新文件。
该文件大约有1,500行,包含任意单词和数字。 (为了更好地理解,请参阅:http://pastebin.com/8ptYacJz,这是我正在处理的文件。)
我需要替换文件中的一个数字。 这个数字位于第800行的中间位置。
问题
有没有人知道在文件中向下移动到第800行中间的有效方法,以便替换一个数字?
我尝试过什么
正则表达式不起作用,因为可能有多个相同数字的实例。
所以我想出了模板文件的解决方案,每次都要编写一个新文件,并将要更改的数字作为模板参数。
此解决方案确实有效,但此人坚持认为我可以将文件指针向下移动到第800行,然后移到行的中间以替换该数字。
这是我遇到问题的唯一代码,它将文件缓冲区转换为一行,然后在我尝试搜索时返回到开头。
import sys
import os
#open file
f = open("output.$2k")
#this will go to line 883 in text file
count = 0;
while count < 883:
line = f.readline()
count = count+1
#this would seek over to middle of file DOESN'T WORK
f.seek(0,0)
line = f.readline()
print(line)
f.close()
答案 0 :(得分:1)
是和否。考虑:
f=open('output.$2k','r+')
f.seek(300)
f.write('\n')
f.close()
此脚本只是将ascii文件中的第300个字符更改为换行符。现在棘手的部分是,在你到达换行符之前,没有办法知道ascii文件中行的长度,而不是读数。因此,将特定字符定位在第800行中间的文件中并非易事。但是,如果您可以保证(由于文件的写入方式)有关行长度,您可以毫无问题地计算位置。另请注意,将1
替换为100
将无效。你需要用1个字符替换1个字符。
对于世界上所有其他* NIX用户而言......请不要在文件名中添加$
。那只是一场噩梦...
答案 1 :(得分:1)
好吧,我不是专业程序员,但我的(愚蠢)方法是:如果它始终是800行,则在跟踪行号时逐行读取文件。然后直接写入新文件。读取第800行,更改它,写入它。然后写下剩下的。愚蠢而不优雅,但它应该工作 - 除非我想念我可能做的事情。我的声誉很低:D
答案 2 :(得分:0)
没有。读入该行,操作它,然后将其写入您之前打开写入的新文件(并且已将其他行写入,未经修改)。
答案 3 :(得分:0)
第一件事:
#this would seek over to middle of file DOESN'T WORK
f.seek(0,0)
这不是真的。这就是文件的开头。
对于您的实际问题:
有没有人知道在文件中向下移动到第800行中间的有效方法,以便替换一个数字?
一般来说,没有。你需要重写文件。例如:
# open the file in read-and-update mode
with open("file", 'r+') as f:
# read all lines
lines = f.readlines()
# update 800'th line
my_line = lines[799].split()
my_line[5] = "%s" % my_number # TODO: put in index of number and updated number
lines[799] = " ".join(my_line)
# truncate and rewrite file
f.truncate(0)
f.writelines(lines)
如果文件中数字的起始位置是可预测的(例如,从文件的开头是number_starting_pos = 1234
)并且字符串表示的大小也是可预测的(例如{{1}),则可以这样做})。
然后你可以重写数字并确保再次用空格填充填充以覆盖前一个条目的任何内容。
与此类似:
20
为了实现这一目标,您需要查看SAP-thingy的文档,并查看空白是否确实无关紧要。
然而,这两种方法都基于许多假设。根据您的使用情况,可能会轻易破坏您的代码,例如:如果插入了一行,或者甚至在数字字段之前插入了一个字符。