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

时间:2013-11-03 13:26:18

标签: 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)

不幸的是,我不知道如何操纵跟踪器所在的单个字符。我知道如何处理读取和写入文件的所有内容基本上都涉及更改整个文件。有没有办法用'*'替换单个指定的'#'?

编辑:我明白了,但现在我遇到了一个新问题。

3 个答案:

答案 0 :(得分:2)

您可以使用readwrite命令查找该位置,然后更改该文件。

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

以下是一个程序,如果它不存在,则会创建一个包含256 + 16 '#'个字符的文件(16 +'\ n'x 16),而是“绘制”一条带有星号的行{{1如果文件存在,则从'*'x0y0x1

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)

上面需要计算线斜率和要绘制的像素数,以下是实际的DDA循环:

# 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

请注意,代码将搜索位置计算为for i in xrange(m + 1): if 0 <= x0 < 16 and 0 <= y0 < 16: # Valid pixel; draw f.seek(y0*17 + x0) f.write('*') # Move to next pixel cx += dx if cx >= m: cx -= m x0 += ix cy += dy if cy >= m: cy -= m y0 += iy :额外y*(16+1)+x用于每行上出现的换行符。最后文件关闭了。

1

以下是两次运行程序后文件的内容:

# All done
f.close()

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

不保证在文本模式下打开文件是有效的,因为(至少在形式上)你只能在线性扫描期间寻找用\n读取的位置并且你不允许写入文件的中间。

答案 1 :(得分:0)

因此,事实证明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()

答案 2 :(得分:-1)

以字符串形式读取整个文件。然后,替换你想要的任何字符和该等式的索引。

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

有用吗?