>source

저는 코딩에 익숙하지 않아 프로그램 사용자의 입력을 다른 줄의 csv 파일로 설정하는 방법을 모릅니다. 현재하는 일은 모두 한 줄에 인쇄하는 것이므로 유용하지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 또한 코드 품질이 좋지 않아 죄송합니다. 최대한 빨리 배우고 있습니다!

코드는 다음과 같습니다.

import csv
def filecreator():
    print("----------INPUT--DATA----------")
    filename = input("File Name: ")
    print("A file has been created named",filename,".csv")
    print("-------------------------------")
    with open(filename+".csv", 'w', newline='') as csvfile:
        w = csv.writer(csvfile, delimiter=',')
        save = "y"
        while save == "y":
            device = input("Source of data: ")
            time_of_data_collection = ("When: ")
            first_data_set = input("Column 3 Title: ")
            second_data_set = input("Column 4 Title: ")
            #Here is where I want to have the break for it to be printed on a
            #second line
            drone = int(input("Drone Number: "))
            time = int(input("Time: "))
            temperature = input("Enter temperature: ")  
            windspeed = input("Enter windspeed: ")
            
            save = input("Would you like to save? Y/N: ")  
            if save.lower() == "y":
                w.writerow([drone, time, temperature, windspeed])   
                print("---Your data has been saved---")
        print("Program closed.")
def viewdata():
    print("----VIEW-DATA----")
    filename = input("File Name: ")
    print("-----------------")
    f = open(filename)
    csv_f = csv.reader(f)
    for row in csv_f:
      print (row)
    print("-----------------")
userinput = input("Enter I to input data, V to view data or C to do calculations: ")
if userinput in ("I", "i"):
    print("\nYou have chosen to input weather data to the program")
    filecreator()
elif userinput=="V" or "v":
    print("\nYou have chosen to view weather data.")
    viewdata()
elif userinput=="C" or "c":
    print("\nYou have chosen to perform calculations with weather data.")

  • 답변 # 1

    수집 된 데이터 위에 헤더 열을 설정하려면 요청하세요.전에데이터를 요청하는 루프를 사용하여 데이터 항목에 대해 수행하는 것과 동일한 방식으로 한 번 작성합니다. w.writerow([drone_header, time_header, temperature_header, windspeed_header]) 대신 열 헤더 정보를 포함합니다.

    각 전화 csv_writer.writerow( [...] ) 한 줄을 씁니다. 사용하면 모든 데이터를 한 번에 쓸 수 있습니다. csv_writer.writerows( [ [...], [...], [...], ... ) 목록 목록을 제공합니다. 각 내부 목록은 데이터의 한 행을 나타냅니다.

    여기에서 더 많은 것을 읽으십시오 :

    csv.csvwriter.writerow

    csv.csvwriter.writerows

    csv 예

    <시간 />

    여전히 수정해야 할 다른 사항이 많이 있습니다.

    elif userinput=="V" or "v":elif userinput=="C" or "c":

    시간을 정수로 입력합니까?

    사용자 입력 위생 없음 (빈 입력, 유효하지 않은 숫자 등)

    현재 코드는 입력, 출력, 파일 쓰기 등의 혼합입니다. 일반적으로 좀 더 잘 구조화하여 입력, 처리, 출력 (할 수있다믹스 앤 매치하지만 더 어렵게 만듭니다.

    다음과 같이 수정할 수 있습니다.

    import csv
    def get_int(text, positive_only = True):
        """Handles input for valid (maybe positive only) integers"""
        while True:
            try:
                i = input(text)
                v = int(i)
                if positive_only and v < 0:
                    raise ValueError()
                return v
            except ValueError:
                print(f"You need to input a {'non negative ' if positive_only else ''}number")
    def filecreator():
        print("----------INPUT--DATA----------")
        filename = input("File Name: ") 
        # fix the filename for good and force a .csv extension
        if not filename.endswith(".csv"):
            filename += ".csv"
        print("Will use ",filename, "to store data.")
        print("-------------------------------")
        # ask headers (INPUT)
        headers = []
        while not headers:
            try:
                headerinput = input("Please enter column headers.They are used as heade for:\n\tdevice, time, data1 (Temperature), data2 (Windspeed)\nInput all comma seperated in one line (): ")
                device_header,time_header, data1_header, data2_header  = [h.strip() for h in headerinput.split(",") if h.strip()]
            except (ValueError, IndexError):
                continue
            headers = [device_header,time_header, data1_header, data2_header]
        # store all datapoinst in a list and write only once afterwards
        data = []
        while True:
            print("Data input:")
            drone = get_int(f"Drone Number ({device_header}):")
            time = get_int(f"Time ({time_header}):") # time as integer? 
            temperature = input(f"Enter temperature ({data1_header}):")
            windspeed = input(f"Enter windspeed ({data2_header}): ")
            data.append([drone,time,temperature,windspeed])
            save = input("Continue data entry? [Y/N]").lower().strip()
            if save == "n":
                break
        # not much of (PROCESSING) done with the data so ... empty 
        # write file (OUTPUT)
        with open(filename, "w", newline ="") as csvfile:
            w = csv.writer(csvfile, delimiter=',')
            w.writerow(headers)
            w.writerows(data)
            print("---Your data has been saved---")
        print("Program closed.")
    def viewdata():
        print("----VIEW-DATA----")
        filename = input("File Name: ")
        print("-----------------")
        with open(filename) as f:
            csv_f = csv.reader(f)
            for row in csv_f:
              print (row) 
        print("-----------------")
    userinput = input("Enter I to input data, V to view data or C to do calculations: ").strip().lower()
    if userinput == "i": 
        print("\nYou have chosen to input weather data to the program")
        filecreator()
    elif userinput=="v":
        print("\nYou have chosen to view weather data.")
        viewdata()
    elif userinput=="c":
        print("\nYou have chosen to perform calculations with weather data.")
    else:
        print ("\nWrong input.")
    
    

    화면 출력 :

    Enter I to input data, V to view data or C to do calculations: i
    You have chosen to input weather data to the program
    ----------INPUT--DATA----------
    File Name: aa
    Will use  aa.csv to store data.
    -------------------------------
    Please enter column headers.They are used as heade for:
            device, time, data1 (Temperature), data2 (Windspeed)
    Input all comma seperated in one line (): drone,time,data1,data2
    Data input:
    Drone Number (drone):42
    Time (time):0815
    Enter temperature (data1):hot
    Enter windspeed (data2): breeze
    Continue data entry? [Y/N]y
    Data input:
    Drone Number (drone):11
    Time (time):9999
    Enter temperature (data1):boiling
    Enter windspeed (data2): hurricane
    Continue data entry? [Y/N]n
    ---Your data has been saved---
    Program closed.
    
    

    생성 된 파일 :

    drone,time,data1,data2
    42,815,hot,breeze
    11,9999,boiling,hurricane
    
    

  • 답변 # 2

    이 줄을 변경하면됩니다.

    with open(filename+".csv", 'w', newline='') as csvfile:
    
    

    "w"는 이전 파일을 덮어 쓰는 새 파일을 작성하기위한 것입니다.

    대신 "a +"로 변경하면 덮어 쓰지 않고 파일에 추가됩니다.

    with open(filename+".csv", 'a+', newline='') as csvfile:
    
    

    open () 메서드에 대한 몇 가지 인수가 있습니다.이를보고 작동 방식을 배우는 것이 유용 할 수 있습니다.

  • 답변 # 3

    테스트 할 데이터 파일이 없지만 화면의 다음 줄로 이동하려면 필요한 위치를 추가하기 만하면됩니다.

    print("\n")
    
    

    또는 writerow 메소드는 매번 새 행을 작성해야합니다. 다음 줄로 이동하려면 필요한 곳에 "\ n"을 입력하십시오.

    데이터를 쓸 때 "\ n"을 추가 할 수 있습니다.

    w.writerow([drone, time, "\n", temperature, windspeed])
    
    

    그러나 파일을 읽어야 할 때주의하십시오. 도움이 되었기를 바랍니다. 그렇지 않으면 더 자세한 정보와 샘플 입력 및 출력 데이터를 제공하십시오.

관련 자료

  • 이전 javascript - Nextjs의 "리플릿"에서 L을 가져 오려면 어떻게해야합니까?
  • 다음 javascript - jQuery를 사용하여 내부에 입력 태그가 없거나 포함되지 않은 양식을 어떻게 찾을 수 있습니까?