Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中打开的txt文件中添加新行?_Python_Python 3.x - Fatal编程技术网

如何在python中打开的txt文件中添加新行?

如何在python中打开的txt文件中添加新行?,python,python-3.x,Python,Python 3.x,我正试图通过改变一个打开的文件来编写一个程序,我需要在打印中添加一行新行 在打开的txt.file文件中,它显示如下(我使用“u”替换为空白): 姓名、身高(米)、体重(公斤) 比尔·卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢 玛丽1.65岁 现在我想添加一个新行,如下所示: 姓名(身高)(米)(公斤)(公斤)(公斤)(岁))(岁)(岁)(岁)()如果"添加

我正试图通过改变一个打开的文件来编写一个程序,我需要在打印中添加一行新行

在打开的txt.file文件中,它显示如下(我使用“u”替换为空白):

姓名、身高(米)、体重(公斤)

比尔·卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢卢

玛丽1.65岁

现在我想添加一个新行,如下所示: 姓名(身高)(米)(公斤)(公斤)(公斤)(岁))(岁)(岁)(岁)()如果"添加一条新的垂直线)是指"向文件中添加一

下面的代码将文件内容作为列表读取,进行更改,然后将更新后的列表写回文件。您也可以通过这种方式向文件中添加行

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
语句很容易使用,因为它会自动关闭您的文件。

我编写了一个小类来完成您要求的所有操作。实现示例在底部完成。让我知道这是否适合你

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)

这个问题已经回答了好几次了。See或OP在他们的帖子中说他们正在使用Python3,所以
print f
应该是
print(f)
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)