How can I fix this "ValueError: can't have unbuffered text I/O" in python 3?

Viewed 29051

This is one of the MIT python project questions, but it's basically written for python 2.x users, so is there any way to fix the following code to operate in the latest python 3?

The current code is raising "ValueError: can't have unbuffered text I/O"

WORDLIST_FILENAME = "words.txt"

def load_words():

    print("Loading word list from file...")

    inFile = open(WORDLIST_FILENAME, 'r', 0)
    # wordlist: list of strings
    wordlist = []
    for line in inFile:
        wordlist.append(line.strip().lower())
    print("  ", len(wordlist), "words loaded.")
    return wordlist
3 Answers

I could overcome this error by using code from this answer:

class Unbuffered(object):
    def __init__(self, stream):
        self.stream = stream

    def write(self, data):
        self.stream.write(data)
        self.stream.flush()

    def writelines(self, datas):
        self.stream.writelines(datas)
        self.stream.flush()

    def __getattr__(self, attr):
        return getattr(self.stream, attr)

import sys
sys.stdout = Unbuffered(sys.stdout)

You can flush to the file after every write.

outFile = open(outputfile, "w",encoding='utf-8')

inFile = open(inputfile, "r",encoding='utf-8')

while inFile:
    line = inFile.readline()[:-1]
    outFile.write(line)
    outFile.flush()
Related