Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python在文件中重写字符串?_Python_File_Replace_File Handling_File Manipulation - Fatal编程技术网

如何使用python在文件中重写字符串?

如何使用python在文件中重写字符串?,python,file,replace,file-handling,file-manipulation,Python,File,Replace,File Handling,File Manipulation,所以我有一个文本文件(称为“数字”),它看起来像这样: 1 - 2 - 3 - 8 - 5 - 6 1 - 2 - 3 - 4 - 5 - 6 1 - 2 - 3 - 4 - 5 - 6 1 - 2 - 3 - 4 - 5 - 6 我想用数字4代替第一行中的数字8。 我该怎么做? 到目前为止,我得到了以下信息: File = open('Numbers.txt','r+') for line in File: Row = line.split(' - ') Four

所以我有一个文本文件(称为“数字”),它看起来像这样:

1 - 2 - 3 - 8 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 6  
我想用数字4代替第一行中的数字8。 我该怎么做?
到目前为止,我得到了以下信息:

File = open('Numbers.txt','r+')  
for line in File:
  Row = line.split(' - ')
  FourthValue = Row[3]
  NewFourthValue = '4'
  NewLine = line.replace(FourthValue,NewFourthValue)
  File.write(NewLine)
  break
File.close()
然后,它将新的正确行追加到文件末尾,如下所示:

1 - 2 - 3 - 8 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 6  
1 - 2 - 3 - 4 - 5 - 61 - 2 - 3 - 4 - 5 - 6

如何使这一新行替换第一行?

文本文件的重写存在问题,因为它们通常具有可变长度的记录,而您的记录是固定长度的,因此:

fh = open('gash.txt','r+') 

# read the first line
line = fh.readline()
row = line.split(' - ')
fourthValue = row[3]

newFourthValue = '4'
newLine = line.replace(fourthValue, newFourthValue)
此时,“当前文件位置”位于下一行的开头,因此我们必须将其移回当前记录的开头

fh.seek(0)
fh.write(newLine)

fh.close()
这是非常简单的。第一行是问题,第一行是问题。如果在其他地方,我们必须使用
fh.tell()
,然后在
fh.seek()中使用该数字来记住每行之前的文件位置

编辑: 在回答问题“如果我想替换第4行中的值而不是第一行中的值”,这将用第4行中的8替换4

lineToChange = 4
fieldToChange = 3
newValue = '8'
sep = ' - '
lineno = 0

fh = open('gash.txt','r+')

while True:
    # Get the current file position
    start_pos = fh.tell()

    # read the next line
    line = fh.readline()
    if not line: break          # exit the loop at EOF

    lineno += 1

    if lineno == lineToChange:
        row = line.split(sep)

        # A different replace mechanism
        row[fieldToChange] = newValue
        newLine = sep.join(row)

        # before writing, we must move the file position
        fh.seek(start_pos)
        fh.write(newLine)

fh.close()

请注意这只起作用,因为我们正在用另一个字符替换单个字符。如果我们想将8替换为10,那么这将不起作用,因为现在行长不同,我们将覆盖下一行的开头。

文本文件重写有问题,因为它们通常具有可变长度的记录,而您的记录是固定长度的,因此:

fh = open('gash.txt','r+') 

# read the first line
line = fh.readline()
row = line.split(' - ')
fourthValue = row[3]

newFourthValue = '4'
newLine = line.replace(fourthValue, newFourthValue)
此时,“当前文件位置”位于下一行的开头,因此我们必须将其移回当前记录的开头

fh.seek(0)
fh.write(newLine)

fh.close()
这是非常简单的。第一行是问题,第一行是问题。如果在其他地方,我们必须使用
fh.tell()
,然后在
fh.seek()中使用该数字来记住每行之前的文件位置

编辑: 在回答问题“如果我想替换第4行中的值而不是第一行中的值”,这将用第4行中的8替换4

lineToChange = 4
fieldToChange = 3
newValue = '8'
sep = ' - '
lineno = 0

fh = open('gash.txt','r+')

while True:
    # Get the current file position
    start_pos = fh.tell()

    # read the next line
    line = fh.readline()
    if not line: break          # exit the loop at EOF

    lineno += 1

    if lineno == lineToChange:
        row = line.split(sep)

        # A different replace mechanism
        row[fieldToChange] = newValue
        newLine = sep.join(row)

        # before writing, we must move the file position
        fh.seek(start_pos)
        fh.write(newLine)

fh.close()

请注意这只起作用,因为我们正在用另一个字符替换单个字符。如果我们想将8替换为10,那么这将不起作用,因为现在行长度不同,我们将覆盖下一行的开头。

在读取第一行后,您需要“倒带”文件,以便覆盖第一行

with open(fname, 'r+') as f:
    row = f.readline()
    row = row.replace('8', '4')
    f.seek(0)
    f.write(row)
但在执行此操作时要小心,因为如果新数据与旧数据的大小不完全相同,则会弄乱以下几行。一般来说,创建一个新文件,将(可能修改过的)行从一行复制到另一行,会更简单、更安全,但是如果您需要处理大型文件,了解这种技术是很好的


FWIW,我的答案处理的是更一般的情况,即在文件中任意位置对数据进行就地修改。

读取第一行后,需要“倒带”文件,以便覆盖第一行

with open(fname, 'r+') as f:
    row = f.readline()
    row = row.replace('8', '4')
    f.seek(0)
    f.write(row)
但在执行此操作时要小心,因为如果新数据与旧数据的大小不完全相同,则会弄乱以下几行。一般来说,创建一个新文件,将(可能修改过的)行从一行复制到另一行,会更简单、更安全,但是如果您需要处理大型文件,了解这种技术是很好的


FWIW,我的答案处理的是更一般的情况,即在文件中任意位置对数据进行就地修改。

这应该非常类似,我希望它比这简单得多,我只是一个业余程序员@Hakala您无法在读/写模式下处理文本文件。你必须读取数据,关闭,然后再次以书面形式打开上一个文件并写入新的数据。这应该是非常类似的,我希望它比这简单得多,我只是一个业余程序员@Hakala您无法在读/写模式下处理文本文件。您必须读取数据,关闭,然后以书面形式再次打开上一个文件并写入新数据。非常感谢。但是,有一件事我可以控制光标在文件中的位置吗?例如,如果我想替换第四行而不是第一行中的值,我可以使用fh.tell或fh.seek来帮助我吗@我非常感谢你。但是,有一件事我可以控制光标在文件中的位置吗?例如,如果我想替换第四行而不是第一行中的值,我可以使用fh.tell或fh.seek来帮助我吗@谢谢你!非常感谢你!