关于Windows:python 3:如何将输出打印到控制台和文件

Python 3 : How to print output to both Console and File

所以基本上我还在学习python编程,目前我在Github上找到了一些代码。

基本上,代码在执行时工作正常,它将输出打印到终端/控制台。但是,我希望将输出保存到文件中,因此遵循了一些教程,并成功地将输出保存到文件中,但是输出没有显示在终端中。

我的问题是,如何执行这个python脚本来显示终端上的输出,同时将输出写入.txt文件?

下面是我正在处理的python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import os
import warnings
import argparse
import sys
import unicodedata

from PIL import Image


COLORS = [

    [0,     (255,255,255),  '97',   'white'],
    [1,     (0,0,0),        '30',   'black'],
    [2,     (0,0,127),      '34',   'blue'],
    [3,     (0,147,0),      '32',   'green'],
    [4,     (255,0,0),      '91',   'light red'],
    [5,     (127,0,0),      '31',   'brown'],
    [6,     (156,0,156),    '35',   'purple'],
    [7,     (252,127,0),    '33',   'orange'],
    [8,     (255,255,0),    '93',   'yellow'],
    [9,     (0,252,0),      '92',   'light green'],
    [10,    (0,147,147),    '36',   'cyan'],
    [11,    (0,255,255),    '96',   'light cyan'],
    [12,    (0,0,252),      '94',   'light blue'],
    [13,    (255,0,255),    '95',   'pink'],
    [14,    (127,127,127),  '90',   'grey'],
    [15,    (210,210,210),  '37',   'light grey']
]

def convert(img, doColor=True, renderIRC=True, cutoff=50, size=1.0, invert=False, alphaColor=(0,0,0)):
    i = Image.open(img)

    WIDTH = int(90*size)
    HIGHT = int(40*size)

    # Resize the image to fix bounds
    s = i.size
    if s[0]==0 or s[1]==0 or (float(s[0])/float(WIDTH))==0 or (float(s[1])/float(HIGHT))==0:
        return []
    ns = (WIDTH,int(s[1]/(float(s[0])/float(WIDTH))))
    if ns[1]>HIGHT:
        ns = (int(s[0]/(float(s[1])/float(HIGHT))),HIGHT)

    i2 = i.resize(ns)

    bimg = []

    for r in range(0,i2.size[1],4):
        line = u''
        lastCol = -1
        for c in range(0,i2.size[0],2):
            val = 0
            i = 0
            cavg = [0,0,0]
            pc = 0

            for ci in range(0,4):
                for ri in range(0,3 if ci<2 else 1):
                    # Convert back for the last two pixels
                    if ci>=2:
                        ci-=2
                        ri=3

                    # Retrieve the pixel data
                    if c+ci<i2.size[0] and r+ri<i2.size[1]:
                        p = i2.getpixel((c+ci,r+ri))
                        alpha = p[3] if len(p)>3 else 1
                        if invert and alpha>0:
                            p = map(lambda x: 255-x, p)
                        elif alpha==0:
                            p = alphaColor
                    else:
                        p = (0,0,0)

                    # Check the cutoff value and add to unicode value if it passes
                    luma = (0.2126*float(p[0]) + 0.7152*float(p[1]) + 0.0722*float(p[2]))
                    pv = sum(p[:3])
                    if luma > cutoff:
                        val+=1<<i
                        cavg = map(sum,zip(cavg,p))
                        pc+=1
                    i += 1

            if doColor and pc>0:
                # Get the average of the 8 pixels
                cavg = map(lambda x:x/pc,cavg)

                # Find the closest color with geometric distances
                colorDist = lambda c:sum(map(lambda x:(x[0]-x[1])**2,zip(cavg,c[1])))
                closest = min(COLORS, key=colorDist)

                if closest[0]==1 or lastCol==closest[0]:
                    # Check if we need to reset the color code
                    if lastCol!=closest[0] and lastCol!=-1:
                        line+='\x03' if renderIRC else '\033[0m'
                    line += unichr(0x2800+val)
                else:
                    # Add the color escape to the first character in a set of colors
                    if renderIRC:
                        line += ('\x03%u'%closest[0])+unichr(0x2800+val)
                    else:
                        line += ('\033[%sm'%closest[2])+unichr(0x2800+val)
                lastCol = closest[0]
            else:
                # Add the offset from the base braille character
                line += unichr(0x2800+val)
        bimg.append(line)
    return bimg


if __name__=='__main__':
    ap = argparse.ArgumentParser()
    ap.add_argument('file', help='The image file to render')
    ap.add_argument('-c',type=int,default=100, help='The luma cutoff amount, from 0 to 255. Default 50')
    ap.add_argument('-s', type=float, default=1.0, help='Size modifier. Default 1.0x')
    ap.add_argument('--nocolor', action="store_true", default=False, help='Don\'t use color')
    ap.add_argument('--irc', action="store_true", default=False, help='Use IRC color escapes')
    ap.add_argument('--invert', action="store_true", default=False, help='Invert the image colors')
    ap.add_argument('--background', default='black', help='The color to display for full alpha transparency')
    ap.add_argument('-f', help="Write to text file")
    args = ap.parse_args()

    alphaColor = (0,0,0)
    for c in COLORS:
        if c[3].lower() == args.background:
            alphaColor = c[1]
            break

    for u in convert(args.file,doColor=not args.nocolor, renderIRC=args.irc, cutoff=args.c, size=args.s, invert=args.invert, alphaColor=alphaColor):
        #sys.stdout = open('I put my path here to .txt file','a')
        print u.encode('utf-8')
    #sys.stdout.close()

看看最后几行语句来打印输出。

PS:这不是我的代码,我只是想通过Python学习一些ASCII艺术。PSS:我正在使用带有cygwin64终端的windows来执行代码。

问候。


不要将stdout设置为文件,而是将其保留为默认值,并在打印时使用文件I/O操作写入文件。

1
2
3
4
5
6
7
8
9
# open the file
f = open('I put my path here to .txt file','a')
for u in convert(args.file,doColor=not args.nocolor, renderIRC=args.irc, cutoff=args.c, size=args.s, invert=args.invert, alphaColor=alphaColor):
    toWrite = u.encode('utf-8')
    # write to the file
    f.write(toWrite)
    print toWrite
# close the file
f.close()