Elrond
Elrond

Reputation: 2112

Replace item in string formatted as csv line

Goal is to replace the second field of csv_line with new_item in an elegant way. This question is different from the topics listed by Rawing because here we are working with a different data structure, though we can use other topics to get inspired.

# Please assume that csv_line has not been imported from a file.
csv_line = 'unknown_item1,unknown_old_item2,unknown_item3'
new_item = 'unknown_new_item2'
goal = 'unknown_item1,unknown_new_item2,unknown_item3'

# Works but error prone. Non-replaced items could be inadvertently swapped.
# In addition, not convenient if string has many fields.
item1, item2, item3 = csv_line.split(',')
result = ','.join([item1, new_item, item3])
print(result)  # unknown_item1,unknown_new_item2,unknown_item3

# Less error prone but ugly.
result_list = []
new_item_idx = 1
for i, item in enumerate(csv_line.split(',')):
    result_list += [item] if i != new_item_idx else [new_item]
result = ','.join(result_list)
print(result)  # unknown_item1,unknown_new_item2,unknown_item3

# Ideal (not-error prone) but not working.
csv_line.split(',')[1] = new_item
print(csv_line)  # unknown_item1,unknown_old_item2,unknown_item3

Upvotes: 1

Views: 236

Answers (4)

Martin Evans
Martin Evans

Reputation: 46759

The second item could be replaced using Python's CSV library by making use of io.StringIO() objects. This behave like files but can be read as a string:

import csv
import io

csv_line = 'unknown_item1,unknown_old_item2,unknown_item3'
new_item = 'unknown_new_item2'

row = next(csv.reader(io.StringIO(csv_line)))
row[1] = new_item
output = io.StringIO()
csv.writer(output).writerow(row)
goal = output.getvalue()

print(goal)

This would display goal as:

unknown_item1,unknown_new_item2,unknown_item3

Upvotes: 3

quamrana
quamrana

Reputation: 39354

This seems the most pythonic:

csv_line = 'unknown_item1,old_item2,unknown_item3'
old_index = 1
new_item = 'new_item2'
goal = 'unknown_item1,new_item2,unknown_item3'

items = csv_line.split(',')
items[old_index] = new_item

print(','.join(items))
print(goal)

Output:

unknown_item1,new_item2,unknown_item3
unknown_item1,new_item2,unknown_item3

Upvotes: -1

Tynan J
Tynan J

Reputation: 69

In the line csv_line.split(',')[1] = new_item, you do not alter the csv_line variable at all. You need to assign the new list created with .split() to a variable before you can change the elements within it:

new_csv = csv_line.split(',')
new_csv[1] = new_item

print(','.join(new_csv))

Upvotes: 1

talz
talz

Reputation: 1200

l = csv_line.split(',')
l[1] = new_item
csv_line = ','.join(l)

Upvotes: 2

Related Questions