1

My goal is to take a CSV that contains 50 rows and one column and import the data into a feature class with over 3,000 rows using arcpy. I want to pick a random row from the CSV and then iterate through the rows in the featureclass.

I will need to use this workflow constantly, but am unsure of how to read the CSV into arcpy.

5
  • 2
    So you want to random select a row in the CSV and insert the same value into all 3000 rows?
    – ianbroad
    Apr 3, 2014 at 16:39
  • I want to random select a row, insert that value into the feature class row, and then repeat. So, I don't want the same value in all 3000 Apr 3, 2014 at 16:42
  • 1
    Is the .csv absolutely necessary? Why not just insert a randomly generated value into the FC using only Python?
    – Aaron
    Apr 3, 2014 at 16:45
  • I was able to do that for fake phone number generation, but it gets tricky with names. I was thinking the best way would be to have a list of fake names in a csv, rather than trying to generate names. Apr 3, 2014 at 16:46
  • OK, I see now. Thanks! Please consider updating your post to include this ancillary info.
    – Aaron
    Apr 3, 2014 at 16:49

2 Answers 2

3

I would use random.choice() to make a random selection from the .csv file and insert that into your FC rows using an Update Cursor.

import arcpy, csv, random

# Read csv file with names
file = r'C:\path\to\your\file.csv'
reader = csv.reader(open(file, "rb"), delimiter = ",", skipinitialspace=True)
listofnames = [name for line in reader for name in line]

# Update rows with random name selection
fc = r'C:\path\to\your\fc'

with arcpy.da.UpdateCursor(fc, ["yourfield"]) as cursor:
    for row in cursor:
        rand = random.choice(listofnames)
        row[0] = rand
        cursor.updateRow(row)
2
  • Aaron, thanks a great deal. Just for my own clarification, when is the syntax for listofnames doing? Your creating a list, and the 'name for line in reader' seems to make sense, but why does it need to be repeated? Apr 3, 2014 at 17:58
  • This is a list comprehension that generates a list from your csv file. It is looping through the lines because my csv values were in a vertical structure as opposed to a horizontal structure. Essentially, it creates a list like ['a','b','c'] that random.choice() can select from rather than one that it cannot e.g. [['a','b','c']].
    – Aaron
    Apr 3, 2014 at 18:16
2
import arcpy
import random
import csv

fc = "C:/stuff.shp"

csv_rows = []

with open("C:/some.csv", "rb") as csvfile:
    reader = csv.reader(csvfile)
    for line in reader:
        csv_rows.append(line)

with arcpy.da.UpdateCursor(fc, ("FIELD2UPDATE")) as update:
    for row in update:
        random = random.randint(0, 49)
        value = csv_rows[random]
        row[0] = str(value)
        update.updateRow(row)

Edited to add updateRow

2
  • 2
    I would do random = random.randint(0, len(csv_rows)-1) instead, in case the CSV grows or shrinks.
    – nmpeterson
    Apr 3, 2014 at 17:58
  • Yeah, that would definitely be a good idea, but I like @Aarons use of random.choice()
    – ianbroad
    Apr 3, 2014 at 18:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.