您可以找到该位置,然后使用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
以上是需要计算线斜率和要绘制的像素数,以下是实际的 DDA 循环:
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作为行终止符(因此每行两个额外的字符),而不仅仅是\n. 如果相反是 Mac,您将需要\r而不是\n.
不能保证以文本模式打开文件,因为(至少在形式上)您只能ftell在线性扫描期间读取的位置寻找,并且不允许在文件中间写入。