To produce the list [('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')] from that CSV data you need to convert the number strings to integer. Here's one way to do that in Python 2.
import csv
data = []
with open('sample.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, skipinitialspace=True)
data.append(tuple(next(reader)))
for num, val in reader:
data.append((int(num), val))
print data
output
[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')]
The csv.reader yields each row of the CSV data as a list. We need to extract the items from that list and convert the 1st one to an int. And then we can pack the two items into a tuple and append it to the data list. However, the header line contains two strings, so we don't want to perform that conversion on the header line.
This code:
data.append(tuple(next(reader)))
gets the header line and just converts it to a tuple and appends the result to our data list.
Note that the Python 2 csv module requires you to open the file in 'rb' mode, but in Python 3 you need to open the file in 'r' mode. Please see the respective module docs for further details. Apart from that, and using the print function instead of the print statement, no other changes are needed to run the above code on Python 3.
[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')]isn't a string. It's a list of tuples. The first tuple contains 2 strings, the other tuples contain an int and a string. So do you want that list, or do you really want a string representation of that list?