您可以找到该位置,然后使用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
在线性扫描期间读取的位置寻找,并且不允许在文件中间写入。