fork download
  1. #!/bin/bash
  2.  
  3. # ideone boilerplate - we can't write files in the home directory;
  4. # so create a temporary directory for our files instead
  5. t=$(mktemp -d -t ideone.XXXXXXXXXXXX) || exit
  6. trap 'rm -rf "$t"' ERR EXIT
  7. cd "$t"
  8.  
  9. init() {
  10. printf 'one %s\n' {1..5} >test1.txt
  11. printf 'two %s\n' {1..50} >test2.txt
  12. }
  13.  
  14. init
  15. nl *.txt
  16.  
  17. cat <<\_ >demo.py
  18. # insert contents of "test1.txt" into "test2.txt" at line 20
  19. with open("test1.txt", "r") as f1:
  20. t1 = f1.readlines()
  21. with open("test2.txt", "r") as f2:
  22. t2 = f2.readlines()
  23. t2.insert(20, t1)
  24. with open("test2.txt", "w") as f2:
  25. f2.writelines(t2)
  26. _
  27.  
  28. python3 demo.py 2>&1 || echo '** Original failed'
  29.  
  30. cat <<\_ >demo2.py
  31. # insert contents of "test1.txt" into "test2.txt" at line 20
  32. with open("test2.txt", "r+") as f2:
  33. for x in range(20):
  34. f2.readline() # skip past early lines
  35. pos = f2.tell() # remember insertion position
  36. f2_remainder = f2.read() # cache the rest of f2
  37. f2.seek(pos)
  38. with open("test1.txt", "r") as f1:
  39. f2.write(f1.read())
  40. f2.write(f2_remainder)
  41. _
  42. python3 demo2.py
  43.  
  44. nl test2.txt
  45. echo '** Incorrect output above; try fixed version'
  46. init
  47.  
  48. cat <<\_ >demo3.py
  49. with open("test2.txt", "r+") as f2:
  50. for x in range(20):
  51. f2.readline() # skip past early lines
  52. pos = f2.tell() # remember insertion position
  53. f2_remainder = f2.read() # cache the rest of f2
  54. f2.seek(pos)
  55. with open("test1.txt", "r") as f1:
  56. for line in f1:
  57. f2.write(line)
  58. f2.write(f2_remainder)
  59. _
  60.  
  61. python3 demo3.py
  62.  
  63. nl test2.txt
  64.  
  65. echo "** pavot.kutaj's version"
  66.  
  67. cat <<\_ >demo4.py
  68. def main():
  69. with open("test2.txt", mode="rt", encoding="utf-8") as f1:
  70. source_list = [line.strip() for line in f1.readlines()]
  71.  
  72. with open("test1.txt", mode="rt", encoding="utf-8") as f2:
  73. insert_list = [line.strip() for line in f2.readlines()]
  74.  
  75. pos = source_list.index("two 21")
  76. source_list[pos: pos] = insert_list #a bit counter-intuitive slicing-approach
  77.  
  78. with open("test2.txt", mode="w", encoding="utf-8") as f1:
  79. f1.write("\n".join(source_list))
  80.  
  81. if __name__ == "__main__":
  82. main()
  83. _
  84.  
  85.  
  86. init
  87.  
  88. python3 demo4.py
  89.  
  90. nl test2.txt
Success #stdin #stdout 0.35s 23480KB
stdin
Standard input is empty
stdout
     1	one 1
     2	one 2
     3	one 3
     4	one 4
     5	one 5
     6	two 1
     7	two 2
     8	two 3
     9	two 4
    10	two 5
    11	two 6
    12	two 7
    13	two 8
    14	two 9
    15	two 10
    16	two 11
    17	two 12
    18	two 13
    19	two 14
    20	two 15
    21	two 16
    22	two 17
    23	two 18
    24	two 19
    25	two 20
    26	two 21
    27	two 22
    28	two 23
    29	two 24
    30	two 25
    31	two 26
    32	two 27
    33	two 28
    34	two 29
    35	two 30
    36	two 31
    37	two 32
    38	two 33
    39	two 34
    40	two 35
    41	two 36
    42	two 37
    43	two 38
    44	two 39
    45	two 40
    46	two 41
    47	two 42
    48	two 43
    49	two 44
    50	two 45
    51	two 46
    52	two 47
    53	two 48
    54	two 49
    55	two 50
Traceback (most recent call last):
  File "demo.py", line 8, in <module>
    f2.writelines(t2)
TypeError: write() argument must be str, not list
** Original failed
     1	two 1
     2	two 2
     3	two 3
     4	two 4
     5	two 5
     6	two 6
     7	two 7
     8	two 8
     9	two 9
    10	two 10
    11	two 11
    12	two 12
    13	two 13
    14	two 14
    15	two 15
    16	two 16
    17	two 17
    18	two 18
    19	two 19
    20	two 20
    21	one 1
    22	one 2
    23	one 3
    24	one 4
    25	one 5
** Incorrect output above; try fixed version
     1	two 1
     2	two 2
     3	two 3
     4	two 4
     5	two 5
     6	two 6
     7	two 7
     8	two 8
     9	two 9
    10	two 10
    11	two 11
    12	two 12
    13	two 13
    14	two 14
    15	two 15
    16	two 16
    17	two 17
    18	two 18
    19	two 19
    20	two 20
    21	one 1
    22	one 2
    23	one 3
    24	one 4
    25	one 5
    26	two 21
    27	two 22
    28	two 23
    29	two 24
    30	two 25
    31	two 26
    32	two 27
    33	two 28
    34	two 29
    35	two 30
    36	two 31
    37	two 32
    38	two 33
    39	two 34
    40	two 35
    41	two 36
    42	two 37
    43	two 38
    44	two 39
    45	two 40
    46	two 41
    47	two 42
    48	two 43
    49	two 44
    50	two 45
    51	two 46
    52	two 47
    53	two 48
    54	two 49
    55	two 50
** pavot.kutaj's version
     1	two 1
     2	two 2
     3	two 3
     4	two 4
     5	two 5
     6	two 6
     7	two 7
     8	two 8
     9	two 9
    10	two 10
    11	two 11
    12	two 12
    13	two 13
    14	two 14
    15	two 15
    16	two 16
    17	two 17
    18	two 18
    19	two 19
    20	two 20
    21	one 1
    22	one 2
    23	one 3
    24	one 4
    25	one 5
    26	two 21
    27	two 22
    28	two 23
    29	two 24
    30	two 25
    31	two 26
    32	two 27
    33	two 28
    34	two 29
    35	two 30
    36	two 31
    37	two 32
    38	two 33
    39	two 34
    40	two 35
    41	two 36
    42	two 37
    43	two 38
    44	two 39
    45	two 40
    46	two 41
    47	two 42
    48	two 43
    49	two 44
    50	two 45
    51	two 46
    52	two 47
    53	two 48
    54	two 49
    55	two 50