Форум сайта python.su
Добрый день. Есть небольшой файл/пример csv/excel, который нужно пропарсить особым образом. В самом файле содержится 3 колонки. На первой строчке находятся названия параметров. Каждый параметр принадлежит к одной колонке под ним. Необходимо, чтобы при запуске кода:
1. спрашивали название файла, который нужно пропарсить,
2. добавляли новый файл csv, куда необходимые нам колонки вставлялись в файл,
3. спрашивали, какие параметры мы хотим получить в новом файле txt,
4. вводили параметры,
5. и записывали эти колонки с параметрами и их значениями в новый файл.
Проблема в том, что не происходит запись в новый файл. То есть открываю файл, а там пусто.
Приложен файл и мой код. Можете ознакомиться.
Также можете предложить свой альтернативный код.
import csv import string fname = input("Enter a file name: ") outputfile = "out.csv" try: fhand = open(fname, mode='r') fcopy = open(outputfile, mode='w') #fcopy2 = open(outputfile, mode='r') except: print ("File don’t exist: ", fname) exit() rdn = csv.reader(fhand, delimiter=';') wrtr = csv.writer(fcopy, delimiter=';') for title in list(rdn)[:1]: print("This file has parameters: ") print(title) ''' rdn = csv.reader(fhand, delimiter=';') i = ' '.join(list(rdn)[0]) print(i) ''' while True: print("---------------------------------------------------------") print("If you want to EXIT this program then type - done") param = input("Enter the required parameter: ") if param == "done": break if not (param in title): print("This parameter doesn't exist. Please try again") exit() rdn = csv.reader(fhand, delimiter=';') print("This file has parameters: ") print(title) titleIndex = title.index(param) print(titleIndex) wrtr = csv.writer(fcopy, dialect='excel') for row in rdn: wrtr.writerow(row) print("---------------------------------------------------------") ''' rdn = csv.reader(fhand, delimiter=';') for c in list(rdn)[:1]: print(c) wrtr2 = csv.reader(fcopy2, delimiter=';') for b in wrtr2: print(b) ''' fhand.close() fcopy.close()
Отредактировано whoami217 (Сен. 9, 2017 14:26:30)
Прикреплённый файлы: text.csv (783 байта)
Офлайн
whoami217Нужно файл перематывать через fhand.seek(0) или закрывать и открывать заново.
Проблема в том, что не происходит запись в новый файл. То есть открываю файл, а там пусто.
Отредактировано py.user.next (Сен. 10, 2017 10:42:35)
Онлайн
py.user.next
Нужно файл перематывать через rdn.seek(0) или закрывать и открывать заново.Закрывать и открывать файл заново не получается, так как все попытки использовать объект файла после вызова fhand.close() будут завершены неудачей:
Прикреплённый файлы: out.csv (813 байт)
Офлайн
Я поправил там выше rdn на fhand.
Онлайн
py.user.next, спасибо. Кое-что получилось. Изменила rdn на fhand: fhand.seek(0). Программа всё хорошо восприняла (без ошибок). Записалось в файл не скомкано (в отдельной ячейке), но проблема теперь в том, что записывает всё, что было в исходном файле. И пропускает каждую чётную строку.
Файл out.csv прикреплен к этому сообщению.
import csv import string fname = input("Enter a file name: ") outputfile = "out.csv" try: fhand = open(fname, mode='r', encoding='utf-8') fcopy = open(outputfile, mode='w') #fcopy2 = open(outputfile, mode='r') except: print ("File don’t exist: ", fname) exit() rdn = csv.reader(fhand, delimiter=';') #wrtr = csv.writer(fcopy, delimiter=';') for title in list(rdn)[:1]: print("This file has parameters: ") print(title) ''' rdn = csv.reader(fhand, delimiter=';') i = ' '.join(list(rdn)[0]) print(i) ''' while True: print("---------------------------------------------------------") print("If you want to EXIT this program then type - done") param = input("Enter the required parameter: ") if param == "done": break if not (param in title): print("This parameter doesn't exist. Please try again") exit() rdn = csv.reader(fhand, delimiter=',') print("This file has parameters: ") print(title) titleIndex = title.index(param) print(titleIndex) fhand.seek(0) wrtr = csv.writer(fcopy, dialect='excel') for row in rdn: wrtr.writerow(row) print("---------------------------------------------------------") fhand.close() fcopy.close()
Прикреплённый файлы: out.csv (813 байт)
Офлайн
whoami217Открывать файлы нужно в бинарном режиме (rb и wb), так как текстовый режим влияет на концы строк, которые в csv строго определены как \r\n.
И пропускает каждую чётную строку.
Отредактировано py.user.next (Сен. 10, 2017 11:10:30)
Онлайн
py.user.next, изменила строки:
fhand = open(fname, mode='rb')
fcopy = open(outputfile, mode='wb')
Исключила try и except, так как при вводе названия исходного файла убивало весь процесс выполнения файла. И получила следующую ошибку:
Enter a file name: text.csv
Traceback (most recent call last):
for title in list(rdn):
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
Присвоила к строке fhand = open(fname, mode='rb') encoding='utf-8' => fhand = open(fname, mode='rb', encoding='utf-8'), и снова получила ошибку:
Enter a file name: text.csv
Traceback (most recent call last):
File “C:\Users\Гранит-Электрон\Desktop\Work\Алёна\Other\for work python\csv_fileColom.py”, line 8, in <module>
fhand = open(fname, mode='rb', encoding='utf-8')
ValueError: binary mode doesn't take an encoding argument
Отредактировано whoami217 (Сен. 10, 2017 12:15:56)
Офлайн
Значит, я неправильно написал про режимы. Во втором питоне так делали.
Пример из документации для третьего питона.
import csv with open('eggs.csv', newline='') as csvfile: spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in spamreader: print(', '.join(row))
Отредактировано py.user.next (Сен. 10, 2017 11:27:57)
Онлайн
py.user.next, если записывать как вы предлагаете (если я Вас правильно поняла)
import csv import string fname = input("Enter a file name: ") outputfile = "out.csv" try: fhand = open(fname, mode='r', newline='') fcopy = open(outputfile, mode='w') except: print ("File don’t exist: ", fname) exit() rdn = csv.reader(fhand, delimiter=' ') for i in rdn: print(', '.join(i)) #rdn = csv.reader(fhand, delimiter=';') for title in list(rdn)[:1]: print("This file has parameters: ") print(title) ''' rdn = csv.reader(fhand, delimiter=';') i = ' '.join(list(rdn)[0]) print(i) ''' while True: print("---------------------------------------------------------") print("If you want to EXIT this program then type - done") param = input("Enter the required parameter: ") if param == "done": break if not (param in title): print("This parameter doesn't exist. Please try again") exit() rdn = csv.reader(fhand, delimiter=',') print("This file has parameters: ") print(title) titleIndex = title.index(param) print(titleIndex) fhand.seek(0) wrtr = csv.writer(fcopy, dialect='excel') for row in rdn: wrtr.writerow(row) print("---------------------------------------------------------") fhand.close() fcopy.close()
Отредактировано whoami217 (Сен. 10, 2017 12:16:15)
Офлайн
Не надо менять delimiter на пробел. Надо поставить точку с запятой, потому что по умолчанию разделитель - запятая (csv - comma separated values).
Отредактировано py.user.next (Сен. 10, 2017 11:54:57)
Онлайн