2
votes

Lecture et impression de la chaîne x fois

J'ai un devoir où j'ai un fichier texte avec un mot sur chaque ligne qui forme une chaîne. Sur certaines lignes, il y a un nombre avec lequel je dois imprimer la chaîne, séparé par une virgule et un espace et terminer par un point

Par exemple:

TEXT = input 'sith.txt'
words = []

with open(TEXT, 'r') as f:
    line = f.readline()
    for word in line:
        if string in word //is a string not an int
            words.append(string)
        else //print words + ', '

Ce qui devrait alors être: Dark Maul est une mauvaise personne, Dark Maul est une mauvaise personne, Dark Maul est une mauvaise personne.

Jusqu'à présent, je suis assez coincé, je Je suis familier avec la façon de lire le fichier ligne par ligne et je suppose que j'ai mis les mots dans une liste et déterminer quand le nombre vient itérer cette liste plusieurs fois.

Jusqu'à présent, j'ai:

Darth
Maul
is
a
bad
person
3

Après cela, je suis à peu près coincé. Quelqu'un là-bas qui pourrait me diriger dans la bonne direction?


4 commentaires

Que faire si les lignes sont Ceci / devrait / être / écrit / 3 / fois / 3 ?


@tobias_k Eh bien, dans ce cas de l'affectation, ce n'est pas le cas.


Ce que je voulais dire, c'était: le numéro sera-t-il toujours dans la dernière ligne, ou une ligne pourrait-elle être un nombre, ce qui signifie que les lignes précédentes (à partir du dernier numéro) devraient être répétées aussi souvent?


@tobias_k Je suppose que cela dépend de la façon dont vous écrivez le programme mais dans ce cas, oui.


6 Réponses :


1
votes

Si l'entier est garanti à la fin, vous pouvez itérer jusqu'à ce que vous atteigniez un entier. S'il peut y avoir plusieurs morceaux de mots avec un int à la fin de chaque morceau de mots, vous pouvez itérer ligne par ligne et essayer de convertir la ligne en int.

TEXT = 'sith.txt'
words = []
multiple = 0

with open(TEXT, 'r') as f:
    # iterate through every line
    for line in f:
        # get rid of the '\n' at the end
        line = line.strip()

        # try casting the line as an int. If it's not an integer, it will raise a ValueError and skip to the except block
        try:
            multiple = int(line)
            for i in range(multiple):
                print(' '.join(words), end=', ')
            print() # for a new line at the end
            words = [] # reset words for new chunk

        # This except block gets run every time int() casting fails on a string
        except ValueError:
            words.append(line)


0 commentaires

1
votes
TEXT = 'sith.txt'                                      #your filename was off a bit
words = []
with open(TEXT, 'r') as f:                             #open it
    line = f.readlines()                               #read in the contents, save to "line"
    for word in line:                                  #for each word in the doc...
        if not word[:-1].isdigit():                    #if it's a word (we exclude last char because it's always "\n"
            words.append(word[:-1])                    #put it in the list
        else:                              
            for i in range(int(word)-1):               #we want to print it n-1 times with commas and once with the period.
                print(" ".join(words), end=", ")       #print with commas.
            print(" ".join(words), end=".\n")          #print with period.
That gives us...

0 commentaires

2
votes

fichier d'exemple: filename = text.txt

Darth Maul is a bad person, Darth Maul is a bad person, Darth Maul is a bad person
Foo bar baz bla, Foo bar baz bla, Foo bar baz bla, Foo bar baz bla, Foo bar baz bla
another demo, another demo

code:

import re

with open('text.txt') as fd:
    data = fd.read()

regex = re.compile(r'([^\d]+)(\d+)', re.DOTALL|re.MULTILINE)
for text, repeat in regex.findall(data):
    repeat = int(repeat)
    text = text.strip().replace('\n', ' ')
    print(', '.join([text] * repeat))

sortie: p>

Darth
Maul
is
a
bad
person
3
Foo bar
baz
bla
5
another
demo
2


3 commentaires

N'oubliez pas de fermer votre fichier. Vous devriez utiliser avec open pour que ce ne soit même pas quelque chose à retenir.


Je pense que vous devez ajouter end = "." dans votre relevé imprimé. Je pense que la phrase est censée se terminer par un "."


@GrantWilliams ajoutant end = '.' fera que ces 3 lignes seront toutes sur une seule ligne. Si le point est si important, il peut être concaténé sur le résultat comme ceci: print (',' .join ([text] * repeat) + '.')



1
votes

KuboMD et moi avons des réponses similaires

TEXT = 'sith.txt'

with open(TEXT, 'r') as file:
    words = []
    for line in file:
        line = line.strip()
        if line.isdigit():
            segment = " ".join(words)
            for i in range (int(line) - 1):
               print(segment, sep =", ")
            print(segment + ".\n")
        else:
            segment.append(line)


0 commentaires

2
votes
# Read the TXT file into a list and strip whitespace from each line
with open('sith.txt', 'r') as infile:
    contents = [i.strip() for i in infile.readlines()]

# Get number of times to repeat phrase using the .pop method which returns the value at the index of an item and removes it from the list
repeat = int(contents.pop(-1))

# Create the phrase to repeat using the range() function and list comprehension
phrase = [' '.join(contents) for _ in range(repeat)]

# Join the phrases together with a comma and print the output
output = ', '.join(phrase)
print(output)

0 commentaires

3
votes

Vous pouvez utiliser des jointures et l'argument de fin dans print pour accomplir cela avec moins de lignes.

lines = open("input.txt", "r").read().splitlines()
data, number = " ".join(lines[:-1]), int(lines[-1])

print(", ".join([data]*number), end=". ")

Quelles sorties:

Dark Maul est une mauvaise personne, Dark Maul est une mauvaise personne, Dark Maul est une mauvaise personne.


0 commentaires