holaprofesor
holaprofesor

Reputation: 271

Reading and writing files

I am trying to read one text file and convert the contents of that file to pig latin on a new file. Here is what I have:

def pl_line(word):
    statement = input('enter a string: ')

    words = statement.split()

    for word in words:
        if len(word) <= 1:
            print(word + 'ay')
        else:
            print(word[1:] + word[0] + 'ay')


def pl_file(old_file, new_file):
    old_file = input('enter the file you want to read from: ')
    new_file = input('enter the file you would like to write to: ')

    write_to = open(new_file, 'w')
    read_from = open(old_file, 'r')

    lines = read_from.readlines()
    for line in lines():
        line = pl_line(line.strip('\n'))
        write_to.write(line + '\n')
    read_from.close()
    write_to.close()

However, when I run this, I get this error message: TypeError: 'list' object is not callable

Any ideas of how to improve my code?

Upvotes: 0

Views: 42

Answers (2)

aghast
aghast

Reputation: 15310

Here are some improvements to the actual converter:

_VOWELS = 'aeiou'
_VOWELS_Y = _VOWELS + 'y'
_SILENT_H_WORDS = "hour honest honor heir herb".split()

def igpay_atinlay(word:str, with_vowel:str='yay'):
    is_title = False
    if word.title() == word:
        is_title = True
        word = word.lower()

    # Default case, strangely, is 'in-yay'
    result = word + with_vowel

    if not word[0] in _VOWELS and not word in _SILENT_H_WORDS:
        for pos in range(1, len(word)):
            if word[pos] in _VOWELS:
                result = word[pos:] + word[0:pos] + 'ay'
                break

    if is_title:
        result = result.title()

    return result

def line_to_pl(line:str, with_vowel:str='yay'):
    new_line = ''

    start = None
    for pos in range(0, len(line)):
        if line[pos].isalpha() or line[pos] == "'" or line[pos] == "-":
            if start is None:
                start = pos
        else:
            if start is not None:
                new_line += igpay_atinlay(line[start:pos], with_vowel=with_vowel)
                start = None
            new_line += line[pos]

    if start is not None:
        new_line += igpay_atinlay(line[start:pos], with_vowel=with_vowel)
        start = None

    return new_line

tests = """
Now is the time for all good men to come to the aid of their party!
Onward, Christian soldiers!
A horse! My kingdom for a horse!
Ng!
Run away!
This is it.
Help, I need somebody.
Oh, my!
Dr. Livingston, I presume?
"""

for t in tests.split("\n"):
    if t:
        print(t)
        print(line_to_pl(t))

Upvotes: 2

Thomas Lotze
Thomas Lotze

Reputation: 5313

You very likely mixed up the assignments to read_fromand write_to, so you're unintentionally trying to read from a file opened only for write access.

Upvotes: 0

Related Questions