2016-05-05 10 views
-2

Ich arbeite an Code, um eine Benutzereingabe Geschäftsname zu nehmen und Bewertungen dafür auszudrucken. Wenn ich meine letzte Schleife durchführe, sage ich Python, um die Bewertungen durch vier Leerzeichen zu rechtfertigen, aber nichts passiert. Ich habe mehrere Lösungen ausprobiert und bin ehrlich ratlos.Right justify funktioniert nicht [Python]

(Problembereich ist die allerletzte Zeile)

import json 
import textwrap 
import sys 
f = open('reviews.json') 
f1= open('businesses.json') 
line1= f1.readline() 
business= json.loads(line1) 
line = f.readline() 
review = json.loads(line) 
idlist=[] 
reviewlist=[] 
bizname= raw_input('Enter a business name => ') 
print bizname 

for line in f1: 
    business= json.loads(line) 
    if bizname == business['name']: 
     idlist.append(business['business_id']) 

if len(idlist)==0: 
    print 'This business is not found' 
    sys.exit() 

for line in f: 
    review = json.loads(line) 
    for item in idlist: 
     if item == review['business_id']: 
      reviewlist.append(review['text']) 
if len(reviewlist)==0: 
    print 'No reviews for this business are found' 
    sys.exit() 
for i in range(len(reviewlist)): 
    w = textwrap.TextWrapper(replace_whitespace=False) 
    print 'Review',str(i+1)+':' 
    print w.fill(reviewlist[i] ,).rjust(4,' ') 
+1

Können Sie ein Beispiel für Eingabe, gewünschte Ausgabe und tatsächliche Ausgabe angeben? – Cyb3rFly3r

+1

Mit "rechtfertigen" meinen Sie eigentlich "Einzug"? – mhawke

Antwort

1

"Right von 4 Leerzeichen rechtfertigen" macht keinen Sinn, es ist so unklar, was Sie wirklich wollen. Das erste Argument zu .rjust() ist die Gesamt Breite des Feldes, und wenn die Zeichenfolge bereits mindestens so lang ist nichts getan wird. Einige Beispiele:

>>> "abcde".rjust(4, " ") # nothing done: 5 > 4 
'abcde' 
>>> "abcd".rjust(4, " ") # nothing done: 4 == 4 
'abcd' 
>>> "abc".rjust(4, " ") # extends to 4 with 1 blank on left 
' abc' 
>>> "ab".rjust(4, " ") # extends to 4 with 2 blanks on left 
' ab' 
>>> "a".rjust(4, " ") # extends to 4 with 3 blanks on left 
' a' 
>>> "".rjust(4, " ") # # extends to 4 with 4 blanks 
' ' 
1

Angenommen, Sie wollen tatsächlich indent der Text, können Sie es tun mit dem TextWrapper Objekt:

indent = ' ' * 4 
w = textwrap.TextWrapper(replace_whitespace=False, initial_indent=indent, subsequent_indent=indent) 

Demo

>>> indent = ' ' * 4 
>>> w = textwrap.TextWrapper(width=20, replace_whitespace=False, initial_indent=indent, subsequent_indent=indent) 
>>> print(w.fill('A longish paragraph to demonstrate indentation with TextWrapper objects.')) 
    A longish 
    paragraph to 
    demonstrate 
    indentation with 
    TextWrapper 
    objects. 

Beachten Sie, dass der Eindruck ist enthalten in der l ine Breite, so dass Sie könnte die Breite entsprechend anpassen möchten:

>>> w = textwrap.TextWrapper(width=20+len(indent), replace_whitespace=False, initial_indent=indent, subsequent_indent=indent) 
>>> print(w.fill('A longish paragraph to demonstrate indentation with TextWrapper objects.')) 
    A longish paragraph 
    to demonstrate 
    indentation with 
    TextWrapper objects. 
0

Höchstwahrscheinlich es nicht funktioniert, weil wrap() einen einzelnen String zurückgibt, die viel länger als 4 Zeichen. Beispiel:

'hello'.rjust(3, '*') 

Ausgang:

'hello' 

Während, wenn Sie tun: ‚hello'.rjust (10, '*')

Ausgang:

'*****hello' 

Wenn ich also verstehe, was Sie zu tun versuchen, müssen Sie möglicherweise die eingepackte Zeichenfolge aufteilen und dann die richtige Ausrichtung auf jede zuweisen String in der Liste, während Sie es drucken:

wrapped = w.fill(reviewlist[i],) 
for line in wrapped.split('\n'): 
    print line.rjust(4, ' ') 

Obwohl ich nicht sicher bin, dass nur vier Zeichen auf einer Breite von rechtfertigen wirklich ist, was Sie brauchen.

0

Es gibt ein paar Probleme, die Sie konfrontiert sind hier:

  1. .rjust (4,‘‚) sagt, daß Sie das Ergebnis wollen breit 4 Zeichen sein, nicht, dass Sie die Zeile 4 einrücken möchten Räume.
  2. .rjust() betrachtet nur die Länge der Zeichenkette, und nachdem Sie sie durch Textwrap ausgeführt haben, enthält sie eine Reihe von Zeilenumbrüchen, die die Länge der Zeichenkette von der ausgegebenen Breite unterscheiden.
  3. Sie möchten nicht Recht, wirklich, Sie einrücken möchten.

Die oben angegebene Lösung für Einrückungen ist korrekt.

Formatieren von Text durch feste Schriftarten ist sehr alt, aber auch sehr zerbrechlich. Vielleicht könnten Sie darüber nachdenken, HTML-Ausgabe in einer späteren Revision Ihrer Anwendung zu generieren. HTML-Tabellen funktionieren dafür gut und eignen sich für Tabellendaten. Alternativ können Sie eine CSV-Datei erstellen und anschließend das Ergebnis in Excel importieren.

0
import textwrap 
import re 

# A sample input string. 
inputStr = 'This is a long string which I want to right justify by 70 chars with four spaces on left' 

# Wrap by 70 (default) chars. This would result in a multi-line string 
w = textwrap.fill(inputStr,) 

# Using RegEx read the lines and right justify for 75 chars. 
m = re.sub("^(\w+.*)$", lambda g : g.group(0).rjust(75), w, flags = re.MULTILINE) 

# Print the result 
print(m) 
+1

Dies ist möglicherweise die richtige Antwort, aber es wird als eine gute Methode angesehen, einige Klarstellungen zu Ihrer Antwort hinzuzufügen, anstatt nur ein Code-Snippet zu posten. Antworten wie diese neigen dazu, nach unten abgestimmt und/oder gelöscht werden. –

+0

@MarkoPopovic - Danke für das Aufzeigen. Ich werde mich daran erinnern. :) – CuriousCat

Verwandte Themen