代码在Python GUI中运行良好,但在命令行中引发错误

时间:2014-03-11 22:19:08

标签: python

我有一些Python代码,它可以很好地运行Python IDE,并且具有似乎也能正常工作的错误处理。但是,在命令行中运行时,代码会抛出此错误:

b = Traceback <most recent call last>
File "test.py" line 295, in <module>
print('b =', b)
File "C:\Python33\lib\encodings\cp850.py", line 19, in ecnode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position
3: character maps to <undefined>

以下是代码本身:

import concurrent.futures
import urllib.request
import json 


URLS = ["http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=a",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=y", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=b", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=d", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=b2",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=b3", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=q", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=p", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=o", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=c1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=d1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=c", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=d2",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=c6",  
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=t1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k2", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=p2",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=c8", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m5", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=c3", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m6",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m7", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=h", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m8",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k1",  
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m3", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=l", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m4",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=l1",  
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=t8",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=w1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=w4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g3",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=p1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g5",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=m2", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=g6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=v", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j1",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j5", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j3", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=f6",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=n",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k5", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=n4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=w", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=s", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=s1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=x",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j2",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=v", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=a5", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=b6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=k3",
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=t7", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=a2", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=t6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=i5", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=l2", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=e", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=l3", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=e7", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=v1", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=e8", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=v7", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=e9", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=s6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=b4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=j4", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=p5",  
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=p6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r2", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r5",   
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r6", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=r7", 
"http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=s7"]

# Retrieve a single page and report the url and contents
def load_url(url, timeout):
    conn = urllib.request.urlopen(url, timeout=timeout)
    return conn.readall()


# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}

    c = 0


    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]

        a = ''
        b = ''
        c += 1

        a = url[47:]
        print('a=', a)


        if a == 'a':
           b =  'Ask' 
        elif a == 'y': 
             b = 'Dividend Yield'
        elif a == 'b':
             b = 'Bid'
        elif a == 'd':
             b = 'Dividend per Share'
        elif a == 'b2':
             b = 'Ask (Realtime)'
        elif a == 'r1':
             b = 'Dividend Pay Date'
        elif a == 'b3':
             b = 'Bid (Realtime)'
        elif a == 'q':
             b = 'Ex-Dividend Date'
        elif a == 'p':
             b = 'Previous Close'
        elif a == 'o':
             b = 'Open'
        elif a == 'c1':
             b = 'Change'
        elif a == 'd1':
             b = 'Last Trade Date'
        elif a == 'c':
             b = 'Change & Percent Change'
        elif a == 'd2':
             b = 'Trade Date'
        elif a == 'c6':
             b = 'Change (Realtime)'
        elif a == 't1':
             b = 'Last Trade Time'
        elif a == 'k2':
             b = 'Change Percent (Realtime)'
        elif a == 'p2':
             b = 'Change in Percent'    
        elif a == 'c8':
             b = 'After Hours Change (Realtime)'
        elif a == 'm5':
             b = 'Change From 200 Day Moving Average'
        elif a == 'c3':
             b = 'Commission'
        elif a == 'm6':
             b = 'Percent Change From 200 Day Moving Average'
        elif a == 'g':
             b = 'Day’s Low'
        elif a == 'm7':
             b = 'Change From 50 Day Moving Average'
        elif a == 'h':
             b = 'Day’s High'
        elif a == 'm8':
             b = 'Percent Change From 50 Day Moving Average'
        elif a == 'k1':
             b = 'Last Trade (Realtime) With Time'
        elif a == 'm3':
             b = '50 Day Moving Average'
        elif a == 'l':
             b = 'Last Trade (With Time)'
        elif a == 'm4':
             b = '200 Day Moving Average'
        elif a == 'l1':
             b = 'Last Trade (Price Only)'
        elif a == 't8':
             b = '1 yr Target Price'    
        elif a == 'w1': 
             b = 'Day’s Value Change'
        elif a == 'g1':
             b = 'Holdings Gain Percent'
        elif a == 'w4':
             b = 'Day’s Value Change (Realtime)'
        elif a == 'g3':
             b = 'Annualized Gain'
        elif a == 'p1':
             b = 'Price Paid'
        elif a == 'g4':
             b = 'Holdings Gain'
        elif a == 'm':
             b = 'Day’s Range'
        elif a == 'g5':
             b = 'Holdings Gain Percent (Realtime)'
        elif a == 'm2':
             b = 'Day’s Range (Realtime)'
        elif a == 'g6':
             b = 'Holdings Gain (Realtime)'
        elif a == 'k':
             b = '52 Week High'
        elif a == 'v':
             b = 'More Info'
        elif a == 'j':
             b = '52 week Low'
        elif a == 'j1':
             b = 'Market Capitalization'
        elif a == 'j5':
             b = 'Change From 52 Week Low'
        elif a == 'j3':
             b = 'Market Cap (Realtime)'
        elif a == 'k4':
             b = 'Change From 52 week High'
        elif a == 'f6':
             b = 'Float Shares'
        elif a == 'j6':
             b = 'Percent Change From 52 week Low'
        elif a == 'n':
             b ='Name'
        elif a == 'k5':
             b = 'Percent Change From 52 week High'
        elif a == 'n4':
             b = 'Notes'
        elif a == 'w':
             b = '52 week Range'
        elif a == 's':
             b = 'Symbol'
        elif a == 's1':
             b = 'Shares Owned'
        elif a == 'x':
             b = 'Stock Exchange'
        elif a == 'j2':
             b = 'Shares Outstanding' 
        elif a == 'v':
             b = 'Volume'
        elif a == 'a5':
             b = 'Ask Size'
        elif a == 'b6':
             b = 'Bid Size'
        elif a == 'k3':
             b = 'Last Trade Size'
        elif a == 't7':
             b = 'Ticker Trend'
        elif a == 'a2':
             b = 'Average Daily Volume'
        elif a == 't6':
             b = 'Trade Links'
        elif a == 'i5':
             b = 'Order Book (Realtime)'
        elif a == 'l2':
             b = 'High Limit'
        elif a == 'e':
             b = 'Earnings per Share'
        elif a == 'l3':
             b = 'Low Limit'
        elif a == 'e7':
             b = 'EPS Estimate Current Year'
        elif a == 'v1':
             b = 'Holdings Value'
        elif a == 'e8':
             b = 'EPS Estimate Next Year'
        elif a == 'v7':
             b = 'Holdings Value (Realtime)'
        elif a == 'e9':
             b = 'EPS Estimate Next Quarter'
        elif a == 's6':
             b = 'Revenue'
        elif a == 'b4':
             b = 'Book Value'
        elif a == 'j4':
             b = 'EBITDA'
        elif a == 'p5':
             b = 'Price-Sales'
        elif a == 'p6':
             b = 'Price-Book'
        elif a == 'r':
             b = 'P-E Ratio'
        elif a == 'r2':
             b = 'P-E Ratio (Realtime)'
        elif a == 'r5':
             b = 'PEG Ratio'
        elif a == 'r6':
             b = 'Price - EPS Estimate Current Year'
        elif a == 'r7':
             b = 'Price - EPS Estimate Next Year'
        elif a == 's7':
             b = 'Short Ratio'



        print('b =', b)
        print('c =', c)
        filename = "%s" % (b)
        filepath = "C:\\Python33\\Stock Data\\" + str(filename) + ".txt"

        try:
            data = future.result() 
            d = open(filepath,"wb")
            d.write(data)
            d.close


            # do json processing here

        except Exception as exc:
            for e in range(1,11):
                if len(data) > 0:
                    print('Byte length = %d' % (len(data)))
                    print(e)
                    print('%r generated an exception: %s' % (url, exc))
                    print('retrying %r' % (url))

                    def load_url(url, timeout):
                        conn = urllib.request.urlopen(url, timeout=timeout)
                        return conn.readall()
                        time.sleep(10)

                        print("press ENTER to exit")


        else:
            print('%r page is %d bytes' % (url, len(data)))

            print("press ENTER to exit")

有谁知道这个错误与什么有关?我对Python很新,我还没有在网上找到答案。

由于

2 个答案:

答案 0 :(得分:2)

此错误是因为您的终端不支持unicode字符... 在某些时候,你正试图打印它们(可能是页面结果)

你可以

  1. 将它们记录到以二进制模式打开的文件
  2. 使用some_text.encode('ascii','replace')
  3. 转义结果

    例如

    print('b =', b.encode('ascii','replace'))
    

    但是标准的windows命令终端不支持unicode字符...大多数IDE都支持,(例如IDLE)

    具体而言我相信这是你的问题

     b = 'Day’s Value Change'   #<--- use a normal apostrophe not a fancy one
    ...
     b = 'Day’s Low' # again should be "Day's Low"
    ...
     etc
    

答案 1 :(得分:0)

你可能有一个&utff-8&#39;字符,你试图将其编码为ascii。您需要明确指定需要使用的编解码器。

b = b.encode('utf-8')

这可以让你打印出来。