Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Python 2.7 - Fatal编程技术网

Python 如何替换文本文件中的单个字符?

Python 如何替换文本文件中的单个字符?,python,python-2.7,Python,Python 2.7,我有一个文本文件,如下所示: ############### ############### ############### ############### ############### ############### ############### ############### ############### ############### ############### ############### ############### ############### 我已经编写了一些代码

我有一个文本文件,如下所示:

###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
我已经编写了一些代码,可以将跟踪器(就是它的名称?)移动到您指定的坐标:

f = open('graphs.txt', 'r+')

while True:
    # TODO: Make an error if X or Y is greater than 15.
    x = input('X = ')
    y = input('Y = ')

    # this thing here finds which character to replace, 
    s = x + y * 16 # this is how far the tracker seeks
    f.seek(s)
不幸的是,我不知道如何操纵跟踪器上的单个字符。我所知道的关于读取和写入文件的所有操作基本上都涉及到更改整个文件。有没有办法用“*”替换单个指定的“#”呢


编辑:我找到了,但现在我有一个新问题。

将整个文件作为字符串读取。然后,替换你想要的任何字符,在方程的索引处

stringthing = file.read //or whatever the read command is
stringthing[s] = '[whatever your char is]'
[write stringthing to file]

有用吗?

将整个文件作为字符串读取。然后,替换你想要的任何字符,在方程的索引处

stringthing = file.read //or whatever the read command is
stringthing[s] = '[whatever your char is]'
[write stringthing to file]

有用吗?

您可以找到该位置,然后使用
read
write
命令更改文件

但是请注意,文本文件对此很烦人,您应该使用二进制文件

下面是一个程序,它创建了一个文件,其中包含256+16个
“#”
字符(16+'\n'x 16),如果文件不存在,则使用星号“*”从
x0
y0
x1
y1
,如果文件存在,则使用星号“绘制”一条线

try:
    f = open("draw.txt", "rb+")
except IOError:
    print "File was not present: creating it"
    f = open("draw.txt", "wb+")
    f.write(("#"*16 + "\n") * 16)
请注意,该文件以二进制模式打开,以避免随机查找/写入问题

# Ask coordinates
x0 = int(raw_input("x0: "))
y0 = int(raw_input("y0: "))
x1 = int(raw_input("x1: "))
y1 = int(raw_input("y1: "))

# Line drawing DDA algorithm
dx = abs(x1 - x0)
ix = 1 if x0 < x1 else -1
dy = abs(y1 - y0)
iy = 1 if y0 < y1 else -1
m = max(dx, dy)
cx = cy = m >> 1
以下是两次运行程序后的文件内容:

################
################
###########*####
###*######*#####
####**####*#####
######**#*######
########**######
########*#**####
#######*########
######*#########
######*#########
#####*##########
################
################
################
################
上面的代码处理Linux或其他类似unix系统的文件。如果Windows操作系统需要文本文件,则必须使用序列
\r\n
作为行终止符(因此每行额外两个字符),而不仅仅是
\n
。如果取而代之的是Mac,则需要
\r
而不是
\n


以文本模式打开文件不一定有效,因为(至少在形式上)您只允许在线性扫描中查找“代码> ftEng/COD>读取的位置,并且不允许在文件中间写入。

您可以查找该位置,然后使用<代码> Read < /COD>和<代码>写< /C>命令>更改文件。

但是请注意,文本文件对此很烦人,您应该使用二进制文件

下面是一个程序,它创建了一个文件,其中包含256+16个
“#”
字符(16+'\n'x 16),如果文件不存在,则使用星号“*”从
x0
y0
x1
y1
,如果文件存在,则使用星号“绘制”一条线

try:
    f = open("draw.txt", "rb+")
except IOError:
    print "File was not present: creating it"
    f = open("draw.txt", "wb+")
    f.write(("#"*16 + "\n") * 16)
请注意,该文件以二进制模式打开,以避免随机查找/写入问题

# Ask coordinates
x0 = int(raw_input("x0: "))
y0 = int(raw_input("y0: "))
x1 = int(raw_input("x1: "))
y1 = int(raw_input("y1: "))

# Line drawing DDA algorithm
dx = abs(x1 - x0)
ix = 1 if x0 < x1 else -1
dy = abs(y1 - y0)
iy = 1 if y0 < y1 else -1
m = max(dx, dy)
cx = cy = m >> 1
以下是两次运行程序后的文件内容:

################
################
###########*####
###*######*#####
####**####*#####
######**#*######
########**######
########*#**####
#######*########
######*#########
######*#########
#####*##########
################
################
################
################
上面的代码处理Linux或其他类似unix系统的文件。如果Windows操作系统需要文本文件,则必须使用序列
\r\n
作为行终止符(因此每行额外两个字符),而不仅仅是
\n
。如果取而代之的是Mac,则需要
\r
而不是
\n


在文本模式下打开文件不能保证工作,因为(至少是形式上的)只允许在线性扫描中查找用“代码> ftEnter/代码>读取的位置,并且不允许在文件中间写入。

,结果是,写()使用覆盖而不是插入,这让事情变得更有帮助。这段代码正是我想要它做的,减去read()位,这是由于我不理解的原因而中断的

f = open('graph.txt', 'rb+')

while True:
    # TODO: Make an error if X or Y is greater than 15.
    x = input('X = ')
    y = input('Y = ')

    # this thing here finds which character to replace, 
    s = x + (y * 16) # this is how far the tracker seeks
    f.seek(s)
    f.write('*')

    f.seek(0, 0)
    print f.read()

因此,write()使用overwrite而不是insert,这使事情变得更有帮助。这段代码正是我想要它做的,减去read()位,这是由于我不理解的原因而中断的

f = open('graph.txt', 'rb+')

while True:
    # TODO: Make an error if X or Y is greater than 15.
    x = input('X = ')
    y = input('Y = ')

    # this thing here finds which character to replace, 
    s = x + (y * 16) # this is how far the tracker seeks
    f.seek(s)
    f.write('*')

    f.seek(0, 0)
    print f.read()


这效率太低了,也许吧。不过,这和电脑在后台做的事情是一样的。这正是我所知道的解决方案。当然有一种方法可以使用
open()
readlines()
来获取行,然后
索引它?也许吧,但正如我所说,我键入的是计算机在后台所做的事情。不……我不知道这里发生了什么。这效率太低了。也许吧。不过,这和电脑在后台做的事情是一样的。这正是我所知道的解决方案。当然有一种方法可以使用
open()
readlines()
获取行,然后
索引它?也许吧,但正如我所说,我键入的内容是计算机在后台执行的操作。不……我不知道这里发生了什么。光标比跟踪器更合适。跟踪器比跟踪器更合适(小调:OP的示例有15个
s,所以我认为16个已经是15*1+1)。我没有试图画线。实际上,我唯一想知道的是如何删除/覆盖单个字符。我知道如何写入文件,但write()将插入字符,对吗?@andrewpanpuch:
write
从当前
seek
位置开始写入传递的字符串。如果将单个字符字符串传递给
write
,则只需写入一个字节。如果需要读取单个字符,只需调用
read(1)
。但是请注意,部分读/写仅支持以二进制模式打开的文件。它是使用插入还是覆盖模式写入?第19行上的
>
是什么意思?(小调:OP的示例有15个
s,所以我认为16个已经是15*1+1)。我没有试图划清界限。实际上,我唯一想知道的是如何删除/覆盖单个字符。我知道如何写入文件,但write()将插入字符,对吗?@andrewpanpuch:
write
从当前
seek
位置开始写入传递的字符串。如果将单个字符字符串传递给
write
,则只需写入一个字节。如果需要读取单个字符,只需调用
re即可