2016-05-26 12 views
0

Ich habe 3 csv, die ich gerne eine Spalte in eine laufende Nummer ändern wird, die von der Anzahl der Zeilen in der Datei abhängt. Zum Beispiel, Datei 1 bekam 400 Zeilen, Datei 2 bekam 240, und Datei 3 bekam 100. so die hinzugefügte Spalte für Datei 1 wird Nummer von 1 bis 400 laufen. so die hinzugefügte Spalte für Datei 2 wird laufende Nummer sein von 401 bis 640. so die hinzugefügte Spalte für Datei 3 wird Zahl von 641 bis 741.Zählnummer mit 3 csvs python

was ich geschrieben habe laufen ist dies

file1 = str(path) + "file1" 
file2 = str(path) + "file2" 
file3 = str(path) + "file3" 
files = [file1, file2, file3] 


class File_Editor(): 
    def line_len(self): 
     for k in range(0,2): 
      file_name = open(files[k] + ".csv") 
      numline = len(file_name.readlines()) 
      print (numline) 

ich für jede Datei mit der Herstellung der laufenden Nummer steckte durch erinnere mich an die Anzahl der Zeilen, die zuvor in der Datei waren.

Vielen Dank!

+++++ EDIT +++++

@roganjosh Thanks a lot, habe ich Ihren Code mit ein wenig für die running_number fixed = 1, habe ich es in der def setzen, dass beide Dateien die gleiche Laufnummer haben .

Eine letzte Sache, wie kann ich in der ersten Zeile Index z. B. "Nummer" hinzufügen und dann aus der zweiten Zeile, die running_number_in_csv ausführen.

Dank

+0

Was sind 'Dateien'? Wie öffnet 'range (0,1)' (was nur '0' ist) 3 Dateien? Außerdem sind Ihre 'print' Anweisungen nach' return' und so drucken Sie nie etwas. Das Benennen der Datei 'file' - des eingebauten Pythons - ist keine gute Übung. Es gibt eine Reihe von Problemen, aber nicht genügend Informationen, um Sie zur Zeit in die richtige Richtung zu weisen. – roganjosh

+0

Ich bin dabei, eine ausführlichere Antwort zu schreiben, da ich Ihre vorherigen Fragen durchgegangen bin. Frühere Fragen sollten wahrscheinlich geschlossen worden sein, sind es aber nicht, was bedeutet, dass Sie Ihre Antwort nicht erhalten und Ihr zugrunde liegendes Problem (ein Missverständnis von Funktionen) immer wieder auftaucht. Wenn Sie auf meine Kommentare antworten möchten, tun Sie dies bitte durch "Kommentar hinzufügen" und verweisen Sie mich mit "@roganjosh" und bitte antworten Sie nicht auf die Antworten mit dem Schreiben einer neuen Antwort. Niemand wird es sehen und es überlagert das Format der Website. – roganjosh

Antwort

0

Mit Blick auf Ihre vorherigen Fragen, die offen sind, ist das allgemeine Thema ein grundlegendes Problem mit dem Verständnis der Verwendung von Funktionen in Python, die nicht angesprochen werden. Ich werde versuchen, einen Teil davon zu entfernen, um ähnliche Fragen zu vermeiden. Ich gehe davon aus, dass Sie aus einem wissenschaftlichen Hintergrund wie ich kommen, also bleibe ich dabei.

Sie übergeben niemals Argumente an Ihre Funktionen, nur self. Stattdessen versuchen Sie, Globals innerhalb der Funktion zu referenzieren, aber es besteht keine Notwendigkeit und es ist verwirrend. Zum Beispiel könnte ich die Gleichung y = x^2 + 3x + 5 haben, die sowohl eine mathematische Funktion als auch eine Python-Funktion sein kann.

def quadratic(value_of_x): 
    y = (value_of_x **2) + (3*value_of_x) + 5 
    return y 

eg_1 = quadratic(5) 
print (eg_1) 
eg_2 = quadratic(3) 
print (eg_2) 

# But this will fail 
#print (y) 

y existiert nur in der Python-Funktion als lokale Variable und zerstört wird, sobald Sie den def/return Block verlassen. In diesem Fall nehmen eg_1, eg_2 den Wert y am Ende der Funktion an und value_of_x nimmt den Wert an, den ich in Klammern auf den Funktionsaufruf (das Argument/die Variable) gesetzt habe. Das ist der Sinn von Funktionen, sie können immer wieder verwendet werden.

Ich kann auch mehrere Argumente an die Funktion übergeben.

def new_quadratic(value_of_x, coefficient): 
    y = coefficient*(value_of_x **2) + (3*value_of_x) + 5 
    return y 

eg_3 = new_quadratic(5, 2) 
print (eg_3) 

Nicht nur kann ich keinen Wert für y außerhalb des Rahmens einer Funktion, aber eine Funktion tut nichts, es sei denn, es nennt. Das tut nichts; Es ist das Äquivalent, die Formel in Ihrem Kopf zu kennen, aber niemals eine Zahl durch zu führen - Sie definieren es nur als etwas, das Ihr Skript könnte verwenden.

starting_number = 5 

def modify_starting_number(starting_number): 
    starting_number = starting_number * 2 
    return starting_number 

print (starting_number) 

Während dies tut, was Sie erwartet, es zu tun. Sie rufen die Funktion auf, d. H. Übergeben Sie die Nummer durch die Formel.

starting_number = 5 

def modify_starting_num(starting_num): 
    starting_num = starting_num * 2 
    return starting_num 

starting_number = modify_starting_num(starting_number) # Calling the function 
print (starting_number) 

Mit dem aus dem Weg, auf Ihre Frage.

import csv 

files = ['file_1', 'file_2'] 

def running_number_in_csv(filename_list): 
    """ running_number resets every time the function is called, but is 
    remembered within the function itself""" 
    running_number = 1 

    for individual_file in filename_list: 
     new_rows = [] # Make something to hold row + extra column 

     # Read contents of each row and append the running number to the list 
     with open(individual_file + '.csv', 'r') as infile: 
      reader = csv.reader(infile) 
      for row in reader: 
       row.append(running_number) 
       new_rows.append(row) 
       running_number += 1 # Increments every row, regardless of file name number 

     # Write the list containing the extra column for running number 
     with open(individual_file + '.csv', 'w') as outfile: # Might need 'wb' in Windows 
      writer = csv.writer(outfile) 
      writer.writerows(new_rows) 

get_running_number = running_number_in_csv(files) # CALL THE FUNCTION :) 
0

@roganjosh ich meinen Code festgelegt haben. Ich weiß, was ist die Länge auf die Datei, jetzt muss ich wie eine Spalte mit laufenden Nummern hinzufügen:

file1 1 bis 400

file2 401-641

Datei 3

642 bis 742

Vielen Dank!

+0

Wie ich in meinem Kommentar gesagt habe, antworten Sie bitte nicht auf meine Kommentare mit dem Schreiben einer Antwort. Auch das wird dein Missverständnis nicht beheben. Ich werde immer noch meine Antwort schreiben, um zu verhindern, dass Sie ähnliche Probleme in der Zukunft haben. – roganjosh