hier mein Code:
Code: Alles auswählen
b = ["Mark Smith", "Bobby Brown", "Sue Miller", "Jenny Igotit"]
c = ["555−1234", "555−9876","555−6743", "867−5309"]
test1 = " ".join(b)
test2 = " ".join(c)
d = '{} \n{}'.format(test1,test2)
print(d)
Code: Alles auswählen
b = ["Mark Smith", "Bobby Brown", "Sue Miller", "Jenny Igotit"]
c = ["555−1234", "555−9876","555−6743", "867−5309"]
test1 = " ".join(b)
test2 = " ".join(c)
d = '{} \n{}'.format(test1,test2)
print(d)
Code: Alles auswählen
names = ["Mark Smith", "Bobby Brown", "Sue Miller", "Lin Dan", "Jenny Igotit"]
numbers = ["555−1234", "555−9876","555−6743", "800-8888", "867−5309"]
Code: Alles auswählen
Mark Smith Bobby Brown Sue Miller Lin Dan Jenny Igotit
555−1234 555−9876 555−6743 800-8888 867−5309
Code: Alles auswählen
#texteins lesen
texteins = open('C:/Users/bah90/Desktop/t1.txt', encoding='utf-8')
a = texteins.read()
a2 = a.splitlines(False)
texteins.close()
#testzwei lesen
textzwei = open('C:/Users/bah90/Desktop/t2.txt', encoding='utf-8')
b = textzwei.read()
b2 = b.splitlines(False)
textzwei.close()
print(a2)
print(b2)
for i in a2:
l = len(i)
print(l)
a2_format = d = '{} \n{}'.format(a2,b2)
print(a2_format)
Ein Formatstring ist quasi eine Vorschrift zur Formatierung. Da ein Beispiel oft mehr sagt als tausend Worte:bahmady hat geschrieben: ↑Dienstag 1. Juni 2021, 10:10 Ich verstehe immernoch nicht wie ich mit den Längenangaben einen Format-String ausgeben soll bzw. was überhaupt mit einem "Format-String" gemeint ist. Und wenn ich die beiden Format-Strings habe, wie soll ich die dann richtig formatiert untereinander ausgeben?
Code: Alles auswählen
eins = 'eins'
formatstring = 'a{!r:>30s}e'
print(formatstring.fomat(eins)) # huhu
Code: Alles auswählen
a 'eins'e
Als Variablennamen am Besten gar nicht. Bitte versteh' mich nicht falsch, für kleine Demo- und Wegwerfskripte habe ich keine sonderlich großen Schwierigkeiten mit Variablennamen, die aus nur einem Buchstaben bestehen, aber I, l, 1 und i lassen sich je nach Schriftart leider kaum unterscheiden und sind deswegen schwer zu lesen.
Wie ich oben in meinem 'huhu'-Beispiel: mit einem Formatstring.
Najaaa... im Prinzip willst Du ja zwei Dateien lesen, deren Dateinamen auf der Kommandozeile übergeben werden sollen, dann für jede Zeile n die maximale Länge max([len(strings in n. Zeile der Dateien)]) ermitteln und daraus einen Formatstring bauen. Also eine Vorschrift, wie breit das betreffende Feld ausgegeben werden soll.bahmady hat geschrieben: ↑Dienstag 1. Juni 2021, 15:40 @LukeNukem
Ich kann meine Hausarbeit abgeben wann ich will. Diese Aufgabe ist die 4.) von 6 Aufgaben mit mehreren Aufgabenteilen. Ich wollte aber nächste Woche mit Datenbanken anfangen (ich mache ein Fernstudium). Ich habe nun mehrere Stunden alles Mögliche ausprobiert, habe in der Dokumentation für die format-Funktion reingeschaut, nichts klappt. Es wäre echt nett wenn du oder ein anderer mir einfach zeigen würde, wie ich die Format-Funktion hier richtig einsetzte. Ich habe soooo viel Zeit in dem kleinen Aufgabenteil investiert, da wird schon ein Lerneffekt da sein!
Code: Alles auswählen
from argparse import ArgumentParser
if __name__ == '__main__':
parser = ArgumentParser(description='mimic paste(1)')
parser.add_argument('filenames', nargs='+', help='the files')
parser.add_argument('--serial', '-s', action='store_true', help='output as columns')
args = parser.parse_args()
Code: Alles auswählen
args.filenames = ["names.txt", "numbers.txt"]
args.serial = True
Code: Alles auswählen
contents = list()
for filename in args.filenames:
with open(filename, 'r') as ifh: # diesen abgekürzten Variablennamen mögen manche hier nicht, ich schon ;-)
content = ifh.read().splitlines() # das entfernt im Gegensatz zu ifh.readlines() auch die Zeilenumbrüche
contents.append(content)
Code: Alles auswählen
contents = [
["Mark Smith", "Bobby Brown", ...],
["555-1234", "555-9876", ...]
]
Code: Alles auswählen
linecount = len(contents[0])
if not all(len(content) == linecount for content in contents[1:]):
raise ValueError('Files do not all have the same linecount')
Code: Alles auswählen
corresponding_lines = list(zip(*contents))
Code: Alles auswählen
corresponding_lines = [('Mark Smith', '555-1234'), ('Bobby Brown', '555-9876'), ...]
Code: Alles auswählen
maxlengths = [max([len(string) for string in corresponding_lines[linenumber]]) for linenumber in range(len(corresponding_lines))]
Code: Alles auswählen
maxlengths = list()
for linenumber in range(len(corresponding_lines)):
maxlength = 0
for string in corresponding_lines[linenumber]:
length = len(string)
if length > maxlength:
maxlength = length
maxlengths.append(maxlength)
Code: Alles auswählen
maxlengths = [30, 10, 11, 10, 12]
Code: Alles auswählen
formatstrings = ' '.join(['{:<%ds}'%(maxlength) for maxlength in maxlengths])
Code: Alles auswählen
for content in contents:
print(formatstring.format(*content))
Code: Alles auswählen
#!/usr/bin/env python
from argparse import ArgumentParser
if __name__ == '__main__':
parser = ArgumentParser(description='mimic paste(1)')
parser.add_argument('filenames', nargs='+', help='the files')
parser.add_argument('--serial', '-s', action='store_true', help='output as columns')
args = parser.parse_args()
contents = list()
for filename in args.filenames:
with open(filename, 'r') as ifh: # diesen abgekürzten Variablennamen mögen manche hier nicht, ich schon ;-)
content = ifh.read().splitlines() # das entfernt im Gegensatz zu ifh.readlines() auch die Zeilenumbrüche
contents.append(content)
# validate input(s)
linecount = len(contents[0])
if not all(len(content) == linecount for content in contents[1:]):
raise ValueError('Files do not all have the same linecount')
if args.serial:
# output files as lines
corresponding_lines = list(zip(*contents))
formatstring = ' '.join(
['{:<%ds}'%(maxlength) for maxlength in [
max([len(string) for string in corresponding_lines[linenumber]])
for linenumber in range(len(corresponding_lines))]])
for content in contents:
print(formatstring.format(*content))
else:
# @todo output files as columns
pass # this part is left as an excercise to the reader
Also äh... ja, nein, vielleicht... Sorry, unter Linux ist das nicht so. Aus "man 1 paste" (GNU Coreutils):__blackjack__ hat geschrieben: ↑Dienstag 1. Juni 2021, 22:51 @LukeNukem: Du hast jetzt den normalen Teil gemacht, also das müsste eigentlich im ``else`` stehen wo das @todo steht. Der ``--serial``-Fall gibt eine Datei pro Zeile aus.
Code: Alles auswählen
-s, --serial
paste one file at a time instead of in parallel
Code: Alles auswählen
if len(set(map(len, contents))) > 1:
raise ValueError('Files do not all have the same linecount')
Code: Alles auswählen
formatstring = ' '.join(
'{:<%ds}'%(maxlength) for maxlength in [
max(len(string) for string in lines)
for lines in corresponding_lines])
Code: Alles auswählen
formatstring = ' '.join('{:<%ds}' % max(map(len, lines)) for lines in zip(*contents))
Code: Alles auswählen
# validate input(s)
linecount = len(contents[0])
if not all(len(content) == linecount for content in contents[1:]):
raise ValueError('Files do not all have the same linecount')
Code: Alles auswählen
if args.serial:
# output files as lines
corresponding_lines = list(zip(*contents))
formatstring = ' '.join(
['{:<%ds}'%(maxlength) for maxlength in [
max([len(string) for string in corresponding_lines[linenumber]])
for linenumber in range(len(corresponding_lines))]])
for content in contents:
print(formatstring.format(*content))
Code: Alles auswählen
contents = list()
for filename in args.filenames:
with open(filename, 'r') as ifh: # diesen abgekürzten Variablennamen mögen manche hier nicht, ich schon ;-)
content = ifh.read().splitlines() # das entfernt im Gegensatz zu ifh.readlines() auch die Zeilenumbrüche
contents.append(content)
Code: Alles auswählen
texteins = 'C:/Users/bah90/Desktop/t1.txt'
textzwei = 'C:/Users/bah90/Desktop/t2.txt'
Code: Alles auswählen
def paste_s(texteins, textzwei):
if __name__ == '__main__':
parser = ArgumentParser(description='mimic paste(1)')
parser.add_argument('filenames', nargs='+', help='the files')
parser.add_argument('--serial', '-s', action='store_true', help='output as columns')
args = parser.parse_args()
contents = list()
for filename in args.filenames:
with open(filename, 'r') as ifh: # diesen abgekürzten Variablennamen mögen manche hier nicht, ich schon ;-)
content = ifh.read().splitlines() # das entfernt im Gegensatz zu ifh.readlines() auch die Zeilenumbrüche
contents.append(content)
Korrekt.
Mein Trick ist, daß ich mit der zip()-Funktion zunächst eine Liste von Tupeln baue, und jedes der Tupel-Elemente in der Liste enthält die Inhalte der korrespondierenden Zeilen. Also das Tupel mit dem Index 0 in der Liste enthält die Daten der ersten, das Tupel-Element mit dem Index 1 in der Liste die aus der zweiten Zeile, und so weiter. Dadurch kann ich ganz einfach über eine weitere List Comprehension die Längen der Strings in den Zeilen ermitteln und mit der max()-Funktion die größte Länge dort herausziehen, und mit dieser Länge baue ich dann einen Teil-Formatstring wie "{:<30s}" für einen linksbündig ausgerichteten String mit 30 Zeichen. Diese Teil-Formatstrings werden dann über die str.join()-Methode zum Gesamt-Formatstring zusammengefaßt.
Na klar. Ich habe den ArgumentParser so konfiguriert, daß er sogenannte "positional arguments" entgegennehmen kann, sowas kennst Du vielleicht (hoffentlich) von etlichen Kommandozeilenprogrammen wie less(1), cat(1) oder grep(1). So kannt Du mein Programm im Prinzip mit so vielen Dateinamen aufrufen, wie Du möchtest, bei Dir zum Beispiel mit zwei: "./programm.py names.txt numbers.txt", aber "./programm.py names.txt numbers.txt numbers.txt names.txt" oder andere Dateien gehen natürlich auch. (Es gibt da eine Grenze, die Deine Kommandozeilenumgebung festlegt, aber die ist heutzutage recht groß und soll uns jetzt hier nicht weiter interessieren). Der Name "filenames" und der Parameter "nargs='+'" in "parser.add_argument()" sorgen dafür, daß die übergebenen Dateinamen von parser.parse_args() in einer Liste (hier: "args") abgelegt werden, die Dein Programm dann im Folgenden über das Attribut "args.filenames" lesen, und -- wie ich hier -- darüber iterieren kann. Wenn Du das Programm also mit "./programm.py names.txt numbers.txt" aufrufst, enthält args.filenames nach dem Aufruf von parse_args() die Liste "['names.txt', 'numbers.txt']" -- und wenn ich mit "for filename in args.filenames:" darüber iteriere... genau.
Naja, die "args.filenames" sind wie gerade erklärt die übergebenen Dateinamen, und "filename" enthält dann für jeden Durchlauf der for-Schleife einen der Dateinamen. Ich öffne dann die Datei mit einem sogenannten "Context Manager" (with open()") zum Lesen, lese die Datei komplett ein, splitte den gelesenen Inhalt zeilenweise ("ifh.read().splitlines()") und hänge die so gewonnene Liste von Zeilen an meine Liste "contents" an, so daß "contents" am Ende eine Liste enthält, bei der jedes Element wiederum eine Liste der Zeilen aus der angegebenen Textdatei ist.
Man kann dir bestimmt helfen. Viele von uns, mich inbegriffen, haben aber anscheinend immer noch nicht ganz verstanden was die genaue Anforderung ist.
Najaaa... Du möchtest oder mußt die Programmiersprache Python lernen. Zum Erlernen einer Programmiersprache ist es meist sehr nützlich, fremden Code zu lesen und zu verstehen -- oder sich jedenfalls ein Verständnis dafür zu erarbeiten. Und zwar, ja, auch Code von Leuten, die mehr Erfahrung haben als man selbst, dabei lernt man gemeinhin am meisten. Und wenn ich Dein Eröffnungsposting richtig verstanden habe, möchtest Du Dir das Verständnis ja auch erarbeiten und keine schlüsselfertige Lösung.
Code: Alles auswählen
dingsbums = [1, 2, 3]
bumsdings = [value**value for value in dingsbums]
Code: Alles auswählen
dingsbums = [1, 2, 3]
bumsdings = list()
for value in dingsbums:
bumsdings.append(value**value)
Code: Alles auswählen
texteins = 'C:/Users/bah90/Desktop/names.txt'
textzwei = 'C:/Users/bah90/Desktop/numbers.txt'
def paste_s(texteins, textzwei):
#texteins lesen und splitten
texteins = open('C:/Users/bah90/Desktop/names.txt', encoding='utf-8')
namen = texteins.read()
namen_split = namen.splitlines(False)
texteins.close()
#testzwei lesen und splitten
textzwei = open('C:/Users/bah90/Desktop/numbers.txt', encoding='utf-8')
nummern = textzwei.read()
nummern_split = nummern.splitlines(False)
textzwei.close()
#Inhalt beider Dateien zu einer Gesamtliste hinzufügen
listen = list()
listen.append(namen_split)
listen.append(nummern_split)
#Gesamtliste in zusammengehörige Elemente aufteilen
zusammengehörige_zeilen = list(zip(*listen))
#Formatstring rstellen mit der Join-Methode, gekoppelt mit der max() - und der range()-Funktion
formatstring = ' '.join(
['{:<%ds}'%(maxlength) for maxlength in [
max([len(string) for string in zusammengehörige_zeilen[linenumber]])
for linenumber in range(len(zusammengehörige_zeilen))]])
#Ausgabe der formatierten Liste
for liste in listen:
print(formatstring.format(*liste))
Code: Alles auswählen
formatstring = ' '.join(
['{:<%ds}'%(maxlength) for maxlength in [
max([len(string) for string in zusammengehörige_zeilen[linenumber]])
for linenumber in range(len(zusammengehörige_zeilen))]])