在文件中的某个点附加,每次增加一个值

时间:2015-07-09 23:15:19

标签: python python-2.7

我对编程完全陌生。这是我的第一个“适当的”项目,将被其他人使用。

程序询问各种问题,然后将新的商店条目写入文件。对于一个空文件,我有大部分工作,但成品需要在现有文件中的特定点插入条目。

2个问题令我感到困惑:

如何在“Back:”之前将新商店条目插入到文件中,以及每次添加条目时如何将“InventoryLocation:”增加1

要追加的文件具有以下结构:

# shop 1
SuperSpaceSquids:
   RewardType: playercommand
   PriceType: free
   Reward:
   - ewarp Shop-SuperSpaceSquids
   MenuItem:
   - type:SKULL_ITEM
   - playerhead:MHF_Squid
   - durability:3
   - amount:1
   - name:&5SuperSpaceSquids
   - 'lore:&6&o"Squid Shop From Space!"'
   Message: ''
   InventoryLocation: 38
   ExtraPermission: ''
# shop 2
HadesKitty:
   RewardType: playercommand
   PriceType: free
   Reward:
   - ewarp Shop-HadesKitty
   MenuItem:
   - type:SKULL_ITEM
   - playerhead:Turtle_Em
   - durability:3
   - amount:1
   - name:&5HadesKitty
   - 'lore:&6&o"our prices are fair!..."'
   Message: ''
   InventoryLocation: 39 # This value needs to be incremented by 1 each time
   ExtraPermission: ''
>> insert new shops here <<
Back:
   RewardType: shop
   PriceType: free
   Reward: Shop_Menu
   MenuItem:
   - type:REDSTONE
   - amount:1
   - name:&cBack
   - lore:&8Back to Shop Menu
   InventoryLocation: 54

这是写入文件的功能:

def write(shop, id, data, desc, skull):
    f = open('file.yml', 'w')
    f.write("  %s:" % shop)
    f.write("\n    RewardType: playercommand")
    f.write("\n    PriceType: free")
    f.write("\n    Reward:")
    f.write("\n    - ewarp shop-%s" % shop)
    f.write("\n    MenuItem:")
    if skull:
        f.write("\n    - Type:SKULL_ITEM")
        f.write("\n    - playerhead:%s" % skull)
        f.write("\n    - durability:3")
    if not skull:
        f.write("\n    - id:%s" % id)
    if data:
        f.write("\n    - durability:%s" % data)
    f.write("\n    - amount:1")
    f.write("\n    - name:&5%s" % shop)
    f.write("\n    - 'lore:&6&o\"%s\"'" % desc)
    f.write("\n    Message:")
    f.write("\n    InventoryLocation:")
    f.write("\n    ExtraPermission: ''")
    f.flush()
    print "\nAll done."
    print "\nHit Return to quit or 1 to add more shops."

    while True:
        choice = raw_input(prompt)
        if choice == "":
            print "\nGoodbye!"
            f.close()
            time.sleep(2)
            exit(0)
        elif choice == "1":
            os.system('cls' if os.name == 'nt' else 'clear')
            input()
        else:
            print "I dont understand that."

3 个答案:

答案 0 :(得分:1)

这是一个很好的问题。我为你写了两个函数:

insert_before_back(列表,列表)

void Update() { #if UNITY_ANDROID || UNITY_IPHONE if (Input.touchCount > 0) { Touch touch = Input.touches[0]; switch (touch.phase) { case TouchPhase.Began: startPos = touch.position; StartCoroutine(Jump()); break; case TouchPhase.Moved: isSwipe = true; float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude; float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude; if (swipeDistHorizontal > minSwipeDistX) { float swipeValue = Mathf.Sign(touch.position.x - startPos.x); if (swipeValue > 0 && !isTouch)//to right swipe { isTouch = true; StartCoroutine(Right()); } else if (swipeValue < 0 && !isTouch)//to left swipe { isTouch = true; StartCoroutine(Left()); } } //add swipe to up if(swipeDistVertical > minSwipeDistY) { float swipeValue = Mathf.Sign(touch.position.y - startPos.y); if(swipeValue > 0 && !isTouch) { isTouch = true; StartCoroutine(Jump2()); } } break; case TouchPhase.Ended: isSwipe = false; isTouch = false; break; } } #endif } IEnumerator Jump2() { yield return new WaitForSeconds(0.05f); if(playerVelocity <= 0.2f) { Debug.Log("Swipe Up"); } } IEnumerator Jump() { if (!isSwipe) { yield return new WaitForSeconds(0.05f); if (!isSwipe && playerVelocity <= 0.2f) { Debug.Log("Tap"); } else { yield break; } } else { yield break; } } IEnumerator Right() { Debug.Log("Right"); } IEnumerator Left() { Debug.Log("Left"); } 接收文件行列表以及要在insert_before_back之前添加的所有行的列表,然后返回一个列表,并在正确的索引中添加项目

add_inventory(list,string)

Back:会获取文件行的​​列表以及您希望增加其库存的商店名称。然后它经过并将该数字加1,并将列表中的值重置为新增加的值。它返回一个新行的列表。

您可以使用这些来修改您读入的行列表,然后只需浏览列表中所有新修改的项目,并将每个项目写入具有相同名称的文件。

以下是我使用这两个函数的一个例子:

add_inventory

答案 1 :(得分:1)

这是一个有趣的问题,heinst提供了一个很好的解决方案。我对这个架构有一些保留意见。以下是我看到的问题,如果这是一个非常小的项目并且预计会在有限的时间内使用,则可以忽略这些问题。

并发和并行问题:   如果多个用户同时尝试阅读和更新库存,我们需要一个不同的解决方案。数据库可以轻松支持库存中的多个同时事务,而不是将文件系统作为持久存储。

可伸缩性问题:   随着事务与时间的增加,文件大小增加并且读取整个文件并更新它将无法很好地扩展。必须使用某种方案在多个文件之间拆分事务。

答案 2 :(得分:-1)

据我所知,我们无法修改文件的中间位置。

您只有两个选择:

  1. 将所有文件作为列表读入内存,然后修改列表,然后将所有列表写入文件。

  2. (推荐)使用xml文件保存信息,但不保存普通文件。因此,您可以使用大量工具来编写或阅读它。