2016-06-06 2 views
1

Я пытаюсь написать программу, изменив открытый файл, и мне нужно добавить новую строку в печать.Как добавить новую строку в открытый txt-файл в python?

В открытом txt.file, он показывает, как это (я использую "_" заменить пробел):

Наименование _____ высота (м) _____ Вес (кг)

Билл ________ 1,58 __________ 58

Mary_____1. 65__________43

...

А теперь я хочу, чтобы добавить новую строку, как это: Имя _____ Высота (м) _____ Вес (кг) _____ Возраст (год) < --- Новая вертикальная линия

Билл ________ 1,58 __________ 58_____________15

Мэри _____ 1,65 __________ 43_____________17

И мой код это:


data_file = open("file.txt", "r") 

print(data_file.read()) 

data_file.close() 

Итак, как я могу добавить еще одну вертикальную линию в открытый файл? Более того, если я хочу добавить несколько строк, как я могу это сделать? более


Одна вещь, я использую Python 3.5

+0

Это было ответит несколько раз. См. Http://stackoverflow.com/questions/11070527/how-to-add-a-new-column-to-a-csv-file-using-python или http://stackoverflow.com/questions/23682236/add -a-new-column-to-an-existing-csv-file –

ответ

0

Я написал небольшой класс, чтобы сделать все, что вы просили, и многое другое. Примеры реализации выполняются внизу. Дайте мне знать, если это сработает для вас.

class Feed(object): 
    def __init__(self, file_name, sep, naming_convention=None): 
     self.file_name = file_name 
     self.feed_item_naming = naming_convention 
     self.sep = sep 
     self.feed = self.load_feed() 

    def get_head(self, file=None):#lmao... 
     ''' 
      Get the header 
      ''' 

     if not file: 
      head = open(self.file_name).readline().split(self.sep) 
     else: 
      head = file[0].split(self.sep) 
     return head 

    def __repr__(self): 
     return repr(self.feed) 

    def load_feed(self): 
     ''' 
      load a feed object 
      set the key of each item to the naming convention 
      if we have multiple item names we increment the name bill becomes bill_2 and then bill_3 etc... 
      ''' 

     #first we open the file and grab the headers 
     file = [x.rstrip() for x in open(self.file_name).readlines()] 
     self.header = self.get_head(file) 
     if not self.feed_item_naming and self.feed_item_naming not in self.header: 
      self.feed_item_naming = self.header[0] 
     data = {} 
     for line in file[1:]: 
      if line != '': 
       line = line.split(self.sep) 
       pos = line[self.header.index(self.feed_item_naming)] 
       while pos in data: 
        try: 
         ending = int(pos[-1])+1 
         pos.replace(pos[-1], ending) 
        except: 
         pos = pos+'_2' 
       data[pos] = {} 
       for item in self.header: 
        data[pos][item] = line[self.header.index(item)] 
     return data 

    def unload_feed(self, file_name=None, sep=None): 
     ''' 
      write the modified feed back out to a data file 
      ''' 

     if not file_name: 
      file_name = self.file_name 
     if not sep: 
      sep = self.sep 

     with open(file_name, 'wb') as file: 
      for i in self.header: 
       if i != self.header[-1]: 
        file.write(i+sep) 
       else: 
        file.write(i) 
      file.write('\n') 
      for i in self.feed: 
       for x in self.header: 
        if x != self.header[-1]: 
         file.write(str(self.feed[i][x])+sep) 
        else: 
         file.write(str(self.feed[i][x])) 
       file.write('\n') 


    def add_key(self, key, default_value=None): 
     ''' 
      Add a key to each of the items 
      ''' 
     if key not in self.header: 
      for i in self.feed: 
       self.feed[i][key]=default_value 
      self.header.append(key) 

    def get_key_value(self, item, key): 
     ''' 
      get the value for the items key 
      ''' 

     return self.feed[item][key] 

    def get_item(self, item): 
     ''' 
      get an individual item 
      ''' 

     return self.feed[item] 

    def set_key_value(self, item, key, value): 
     ''' 
      set the value of each items key 
      {item:{key:value, key:value}, item...etc} 
      ''' 

     self.feed[item][key] = value 

    def set_key_values(self, item, key_value_dict): 
     ''' 
      set multiple key values for an item 
      ''' 

     for k,v in key_value_dict.iteritems(): 
      self.set_key_value(item, k, v) 

    def add_item(self, item): 
     ''' 
      Add a new item 
      ''' 
     while item in self.feed: 
      try: 
       end = str(int(item[-1])+1) 
       item = item.replace(item[-1], end) 
      except: 
       item = item+'_2' 

     self.feed[item] = {} 
     self.feed[item][self.feed_item_naming] = item 
     for i in self.header: 
      if i != self.feed_item_naming: 
       self.feed[item][i] = None 

f = Feed('file.txt', '_____', 'Name') #initialize a new feed object, make sure that all seperators are the same for each item in your file 
f.add_item('Angela') #add a new item 
f.set_key_values('Angela', {'Height(m)':5, 'Weight(kg)':123}) #set the new items height and weight 
f.add_key('Position')#create a new key for each item 
f.unload_feed() #write the feed back to the file 
print(f) 
+0

OP говорит, что они используют Python 3 в своем сообщении, поэтому 'print f' должен быть' print (f) '. – Daniel

+0

да, конечно. Обновлено! – TheLazyScripter

0

Если на «добавить новую вертикальную линию» вы имеете в виду «добавить новый столбец» в файл, вы можете сделать это с помощью модуля csv.

Приведенный ниже код работает, читая содержимое вашего файла в виде списка, внося изменения, а затем записывая обновленный список обратно в файл. Вы также можете добавить строки в свой файл.

import csv 

with open('file.txt', 'r') as f: 
    reader = list(csv.reader(f, delimiter=' ')) # if your file is delimited by spaces, tabs, etc. 
               # include that value here. It appears that 
               # your file is space-delimited, but that's 
               # just a guess based on the info in your question. 
    for i,row in enumerate(reader): 
     if i == 0: 
      row.append('Age(year)') 
     if i == 1: 
      row.append('15') 
     if i == 2: 
      row.append('17') 

with open('file.txt','w') as f: 
    wr = csv.writer(f, delimiter=' ') 
    for row in reader: 
     wr.writerow(row) 

# file.txt output: 
# Name Height(m) Weight(kg) Age(year) 
# Bill 1.58 58 15 
# Mary 1.6 43 17 

Этот код также использует with операторы при работе с файлом. Использование либо with, либо close() (например, вы включили в свой вопрос) является правильной практикой при работе с файлами. Оператор with прост в использовании, так как он автоматически закрывает ваш файл.

Смежные вопросы