在Python 3.3.2中保存打印内容到.TXT文件的方法

0 投票
3 回答
505 浏览
提问于 2025-04-17 22:32

我写了一段代码,可以随机生成游戏中角色的力量和技能值,代码如下:

import random
input('Character name 1 ')

print ('Stamina of Character 1  =', (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
print ('Strength of Character 1 =', (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
input('Character name 2 ')

print ('Stamina of Character 2 =', (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
print ('Strength Character 2 =', (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)

这段代码是可以正常工作的,但我需要把程序的结果保存到一个.txt文件里,玩家可以打开这个文件查看,力量和技能值要以角色的名字保存。请问有没有办法把程序打印的内容保存到文本文件里,还是说我需要做其他的事情?任何帮助都非常感谢。

3 个回答

0

我会用csv.DictWriter来创建一个csv文件,文件的第一行是列名,比如'姓名'、'耐力'、'力量'。另外,如果你想保存你打印出来的内容,可以创建一个很长的字符串,然后用打开、写入、关闭的方式来处理。我现在得走了,稍后会详细说明。

你应该先创建一些变量,然后在打印和写入时使用它们。你可以用循环来确定名字和其他特征。注意,我没有使用with open这种写法,是为了方便设置一个函数,并在关闭之前进行其他处理和写入。如果你想在结束时自动关闭文件,可以使用

with open('file.txt', 'ab') as f:

这种方法。这会在你退出作用域时自动关闭文件(通过缩进可以看出)。

import random

f = open('file.txt', 'ab')
name = input('Character name: ')
while name != 'done':
    stamina = (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
    strength = (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
    outline = 'name = ' + name + 'stamina = ' + stamina + 'strength = ' + strength
    print outline
    f.write(outline+'\n')
    name = input('Character name: ')
f.close()

'ab'模式会在文件不存在时创建文件,或者在文件已经存在时追加内容。

对于csv文件,你会使用

import random

import csv
ofile = open('file.txt', 'ab')
outfields = ['Name', Stamina', Strength]
outfile = csv.DictWriter(ofile, fieldnames=outfields)
outfile.writerow(dict((fn, fn) for fn in outfields))
name = input('Character name: ')
row = {}
while name != 'done':
    row['Name'] = name
    stamina = (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
    strength = (((random.randrange(1,12)//(((random.randrange(1,4)))))))+10)
    row['Strength] = strength
    row['Stamina'] = stamina
    print row
    outfile.writerow(row)
    name = input('Character name: ')
ofile.close()

当然,你需要创建一个Python程序来读取csv文件并处理它,而不是让用户直接在编辑器中打开文本文件,使用csv.DictReader。不过,这也可以是游戏的一部分。

0

大家给出的答案都需要你手动打开文件,并在打印内容的同时选择写入这些文件。如果你只是想同时把内容打印到文件和屏幕上,可以使用Python的logging模块。

import logging
import sys

logging.basicConfig(filename='logfile.txt', filemode='w', level=logging.DEBUG,
        format='%(message)s')

logger = logging.getLogger()
stdout = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(stdout)

logger.info('This is a logged message. It will appear at both the screen'
        + ' and in the logfile.')

然后当你运行这个代码时,在控制台上你会看到:

$ python3 logger.py
This is a logged message. It will appear at both the screen and in the logfile.

输出会显示在屏幕上,同时也会写入一个日志文件:

$ cat logfile.txt 
This is a logged message. It will appear at both the screen and in the logfile.

日志记录器不仅仅能做这些,它们还可以实现更多功能,但对于基本的需求来说已经足够了。如果你需要更多帮助,可以查看基本的日志记录教程

1

你可以很简单地把文字写入文件。可以看看这个链接:http://docs.python.org/3.3/tutorial/inputoutput.html#reading-and-writing-files

与其把内容打印到屏幕上,不如这样把它写入文本文件:

with open('characters.txt', 'w') as f:
    name1 = input('Character name 1:')
    f.write("Character name 1: " + name1)
    stamina = random.randrange(1,12) // (random.randrange(1,4) + 10)
    # stamina is a integer, but we need to write it as a string
    f.write("Stamina of Character 1 = " + str(stamina))

    name2 = input('Character name 2:')
    # etc ...

不过,这段代码还有很多可以改进的地方。我会尽量解释一些。

如果你对每个字符都保存相同的信息,就没必要重复写代码。可以考虑使用一个函数来处理这个:

def save_character_stats(f, n=1):
    name = input("Character name {0}: ")
    stamina = random.randrange(1,12) // (random.randrange(1,4) + 10)
    strength = random.randrange(1,12) // (random.randrange(1,4) + 10)
    f.write("Character name {0}: {1}".format(n, name))
    f.write("Stamina: {0}".format(stamina))
    f.write("Strength: {0}".format(strength))
    f.write("\n")


with open('characters.txt', 'w') as f:
    for i in range(2):
        save_character_stats(f, i)

其实你并不需要在计算值的时候就写入文件。通常来说,先用一个函数计算出值,再用另一个函数把它写入文件会更清晰:

def new_character_stats():

    def random_value():
        return random.randrange(1,12) // (random.randrange(1,4) + 10)

    return {
        'stamina': random_value()
        'strength': random_value()
    }

def save_character_stats(characters=3):
    with open('characters.txt', 'w') as f:
        for i in range(characters):
            name = input("Character name {0}: ".format(i))
            stats = new_character_stats()
            f.write("Character name {0}: {1}".format(n, name))
            f.write("Stamina: {0}".format(stats['stamina']))
            f.write("Strength: {0}".format(stats['strength']))
            f.write("\n")

注意,为了让提供值的代码只出现一次,我们使用了一个额外的函数。

你还可以考虑其他改进,比如:

  • 用简单的模板来写内容。可以查查文档中的字符串格式化。
  • 给随机公式使用有意义的变量名(不要随便用一些神秘的数字!)
  • 把信息保存为更易于机器读取的格式。可以查查文档中的json模块。

祝你好运!

撰写回答